初始化具有可变初始值的C ++向量

时间:2014-03-18 06:24:25

标签: c++ vector

我正在编写一个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)我写的代码到底是做什么的?

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());

Live demo.

答案 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++;});
相关问题