我正在编写一个Union查找数据结构,并试图用一个值parent [i] = i来初始化父向量。在c ++中是否有一种方法来初始化这样的向量,即声明一个向量大小为N,而不是为每个元素分配固定值,而是将位置相关值分配给每个元素。 (不使用任何明显的for循环)
This is what I was looking for:
std::vector<int> parent(Initializer);
其中,初始化程序是某个类或函数。
为了尝试一下我的手,我写道:
#include <iostream>
#include <vector>
using namespace std;
class Initializer {
private:
static int i;
public:
int operator() ()
{
return i++;
}
};
int main()
{
vector<int> parent(Initializer);
cout << parent[0];
return 0;
}
但是我认为我在这里搞砸了我的概念非常糟糕,而且我没有得到声明的含义,或者它正在做什么。
请回答这两个问题,
(1)如何初始化具有可变初始值的向量。
(2)我写的代码到底是做什么的?
答案 0 :(得分:4)
这是一个函数声明:
vector<int> parent(Initializer);
Becasue Initializer
是一个类型名称,您声明了一个函数parent
,它将Initializer
作为(未命名的)参数并返回vector<int>
。见Most vexing parse.
要做你想做的事,你可以这样做:
std::vector<int> parent(N); // where N is the size you want
std::iota(parent.begin(), parent.end(), 0); // fill it with consecutive values
// starting with 0
您可以使用std::generate
算法来保存范围内的函数(或函数对象)的结果:
std::generate(parent.begin(), parent.end(), Initializer());
答案 1 :(得分:1)
有几种选择。如果要使用增加的值初始化矢量,则可以使用std::iota
。
std::vector<int> vec(size);
std::iota(std::begin(vec), std::end(vec), 0);
如果您想要更通用的内容,可以使用std::generate
。
std::vector<int> vec(size);
int n = 0;
std::generate(std::begin(vec), std::end(vec), [&n]() {return n++;});