使用变量初始值初始化 C++ 向量

Dre*_*f D 0 c++ vector

我正在编写一个 Union find 数据结构,并试图用值 parent[i]=i 初始化父向量,在 C++ 中有没有办法像这样初始化向量,即声明一个大小为 N 的向量,并且不为每个元素分配固定值,而是为每个元素分配位置相关值。(不使用任何明显的 for 循环)

This is what I was looking for:
  std::vector<int> parent(Initializer);
Run Code Online (Sandbox Code Playgroud)

其中 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;
}
Run Code Online (Sandbox Code Playgroud)

然而,我认为我在这里把我的概念搞得一团糟,我不明白声明的意思,或者它在做什么。

请回答这两个问题,

(1) 如何用可变初始值初始化向量。

(2)我写的代码到底是做什么的?

jro*_*rok 5

这是一个函数声明:

vector<int> parent(Initializer);
Run Code Online (Sandbox Code Playgroud)

因为Initializer是一个类型名称,所以你声明了一个函数parent,它接受Initializer一个(未命名的)参数并返回vector<int>. 请参阅最烦人的解析。

要做你想做的事,你可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

std::generate算法,您可以使用保存在一个范围内的函数(或函数对象)的结果:

std::generate(parent.begin(), parent.end(), Initializer());
Run Code Online (Sandbox Code Playgroud)

现场演示。