![](/img/trans.png)
[英]Initialization of std::string from std::vector<unsigned char> causes error
[英]Initialization of std::vector<unsigned int> with a list of consecutive unsigned integers
我想使用一种特殊的方法来初始化一个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: - | 第二个变体是否存在,如果存在,我该如何强制它被调用?
至少有三种方法可以做到这一点。 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());
使用自增量迭代器执行此操作的非增强方法。
#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;
}
}
C ++ 11:
std::vector<int> idxs (n);
std::generate_n (idxs.begin (), n, [] { static int i {1}; return i++; });
不,这种变体不存在。 第二个构造函数从两个指向另一个序列的迭代器初始化一个向量。
下面是一个“双迭代器”构造函数的示例:
int fill_data[4] = { 1, 2, 3, 4 };
std::vector<int> v(fill_data, fill_data + 4);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.