【发布时间】:2012-09-12 18:22:14
【问题描述】:
在许多语言中,都有有助于初始化集合的生成器。在 C++ 中,如果想统一初始化一个向量,可以这样写:
std::vector<int> vec(10, 42); // get 10 elements, each equals 42
如果想即时生成不同的值怎么办?例如,用 10 个随机值,或者从 0 到 9 的连续数字对其进行初始化?这种语法会很方便,但它在 C++11 中不起作用:
int cnt = 0;
std::vector<int> vec(10, [&cnt]()->int { return cnt++;});
有没有一种通过迭代函数调用来初始化集合的好方法?我目前使用这种丑陋的模式(不比循环更具可读性/短):
std::vector<int> vec;
int cnt = 0;
std::generate_n(std::back_inserter(vec), 10, [&cnt]()->int { return cnt++;});
有一件事会有所帮助,它可以解释第一个构造函数的缺失。我可以想象一个迭代器,它接受一个函数和调用次数,以便构造函数
vector ( InputIterator first, InputIterator last);
将适用。但是我在标准库中没有找到类似的东西。我错过了吗?第一个构造函数没有达到标准还有其他原因吗?
【问题讨论】:
-
我不觉得那个模式那么难看,但我喜欢这个问题。我很想知道除了避免类接口膨胀之外是否还有其他原因。
-
从好的方面来说,C++ 是您编写实现所需语义的可迭代对象的完美语言!
标签: c++ c++11 iterator initialization stdvector