我想使用一种特殊的方法来初始化std::vector<unsigned int>
,这在我用作参考的C ++书中有所描述(如果重要的话,由Ulrich Breymann撰写的德语书“Der C ++ Programmer”)。该书中有关于STL序列类型的部分,特别提到list
,vector
和deque
。在本节中,他写道,这种序列类型有两个特殊的构造函数,即如果X
引用这样的类型,
X(n, t) // creates a sequence with n copies of t
X(i, j) // creates a sequence from the elements of the interval [i, j)
我想以unsigned int
的间隔使用第二个,即
std::vector<unsigned int> l(1U, 10U);
获取使用{1,2,...,9}
初始化的列表。然而,我得到的是一个unsigned int
值为10的向量: - |第二个变体是否存在,如果是,我该如何强制它被调用?
答案 0 :(得分:20)
至少有三种方法可以做到这一点。 Brian先前提到过一个
//method 1
generate(v.begin(), v.end(), [] { static int i {1}; return i++; });
如果您使用的是c ++ 11
,也可以使用std :: iota//method 2
iota(v.begin(), v.end(), 1);
或者您可以使用1s初始化容器,然后对其进行部分求和。我认为没有人会使用第三种方法:)
//method 3
vector<int> v(n, 1);
partial_sum(v.begin(), v.end(), v.begin());
答案 1 :(得分:10)
重读附近的段落,描述每个参数是什么。具体来说,应该提到i
和j
不是值,而是迭代器。此构造函数通常用于制作其他类型容器的副本。如果您想获得一系列值,Boost library会提供counting iterator,这正是您想要的。
std::vector<unsigned int> numbers(
boost::counting_iterator<unsigned int>(0U),
boost::counting_iterator<unsigned int>(10U));
答案 2 :(得分:3)
使用自增量迭代器执行此操作的非增强方法。
#include <vector>
#include <iostream>
#include <algorithm>
static int NUM_ITEMS = 10;
class gen_range {
public:
gen_range(int i) { idx = i; }
int operator()() { return (idx++); };
int idx;
};
int main() {
std::vector<int> x(NUM_ITEMS);
std::generate_n(x.begin(), NUM_ITEMS, gen_range(0));
for (int i=0; i < x.size(); i++) {
std::cout << x[i] << std::endl;
}
}
答案 3 :(得分:2)
C ++ 11:
std::vector<int> idxs (n);
std::generate_n (idxs.begin (), n, [] { static int i {1}; return i++; });
答案 4 :(得分:1)
不,该变体不存在。第二个构造函数从两个指向另一个序列的迭代器初始化一个向量。
以下是“双迭代器”构造函数的一个示例:
int fill_data[4] = { 1, 2, 3, 4 };
std::vector<int> v(fill_data, fill_data + 4);