我想填充一个vector<int>使用std::fill,但不是一个值,矢量应该包含数字后增加的顺序.
我尝试通过迭代函数的第三个参数来实现这一点,但这只会给我一个填充1或2的向量(取决于++运算符的位置).
例:
vector<int> ivec;
int i = 0;
std::fill(ivec.begin(), ivec.end(), i++); // elements are set to 1
std::fill(ivec.begin(), ivec.end(), ++i); // elements are set to 2
Run Code Online (Sandbox Code Playgroud)
BoB*_*ish 97
最std::iota好像这样使用:
std::vector<int> v(100) ; // vector with 100 ints.
std::iota (std::begin(v), std::end(v), 0); // Fill with 0, 1, ..., 99.
Run Code Online (Sandbox Code Playgroud)
也就是说,如果你没有任何c++11支持(在我工作的地方仍然是一个真正的问题),请使用std::generate如下:
struct IncGenerator {
int current_;
IncGenerator (int start) : current_(start) {}
int operator() () { return current_++; }
};
// ...
std::vector<int> v(100) ; // vector with 100 ints.
IncGenerator g (0);
std::generate( v.begin(), v.end(), g); // Fill with the result of calling g() repeatedly.
Run Code Online (Sandbox Code Playgroud)
Ole*_*rov 34
你应该使用std::iota算法:
std::vector<int> ivec;
std::iota(ivec.begin(), ivec.end(), 0);
Run Code Online (Sandbox Code Playgroud)
因为std::fill只是将给定的固定值分配给给定范围[n1,n2]中的元素.和std::iota填充用依次增大的值,与初始值开始,然后在给定范围[N1,N2) ++value.您还可以使用std::generate作为替代.
不要忘记那std::iota是C++ 11 STL算法.但是很多现代编译器都支持它,例如GCC,Clang和VS2012:http://msdn.microsoft.com/en-us/library/vstudio/jj651033.aspx
Jam*_*nze 11
我的第一选择(即使在C++ 11中)将是
boost::counting_iterator:
std::vector<int> ivec( boost::counting_iterator<int>( 0 ),
boost::counting_iterator<int>( n ) );
Run Code Online (Sandbox Code Playgroud)
或者如果已经构造了向量:
std::copy( boost::counting_iterator<int>( 0 ),
boost::counting_iterator<int>( ivec.size() ),
ivec.begin() );
Run Code Online (Sandbox Code Playgroud)
如果你不能使用Boost:或者std::generate(如其他答案中所建议的那样),或者counting_iterator你自己实现,如果你需要在不同的地方.(有增强,你可以使用transform_iterator的counting_iterator创建各种有趣的序列,没有加速,你可以手工做很多这一点,无论是在一台发电机的对象类型的形式std::generate,或者是你可以插入一个手写计数迭代器.)
小智 7
我已经看到了std :: generate的答案,但是您也可以通过在lambda中使用静态变量来“改善”它,而不是在函数外部声明一个计数器或创建一个generator类:
std::vector<int> vec;
std::generate(vec.begin(), vec.end(), [] {
static int i = 0;
return i++;
});
Run Code Online (Sandbox Code Playgroud)
我觉得它更简洁
如果您不想使用C++ 11功能,可以使用std::generate:
#include <algorithm>
#include <iostream>
#include <vector>
struct Generator {
Generator() : m_value( 0 ) { }
int operator()() { return m_value++; }
int m_value;
};
int main()
{
std::vector<int> ivec( 10 );
std::generate( ivec.begin(), ivec.end(), Generator() );
std::vector<int>::const_iterator it, end = ivec.end();
for ( it = ivec.begin(); it != end; ++it ) {
std::cout << *it << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
该程序打印0到9.
std::iota 仅限于序列 n, n+1, n+2, ...
但是,如果您想用通用序列 f(0)、f(1)、f(2) 等填充数组该怎么办?通常,我们可以避免使用状态跟踪生成器。例如,
int a[7];
auto f = [](int x) { return x*x; };
transform(a, a+7, a, [a, f](int &x) {return f(&x - a);});
Run Code Online (Sandbox Code Playgroud)
将产生正方形序列
0 1 4 9 16 25 36
Run Code Online (Sandbox Code Playgroud)
然而,这个技巧不适用于其他容器。
如果你坚持使用 C++98,你可能会做一些可怕的事情,比如:
int f(int &x) { int y = (int) (long) &x / sizeof(int); return y*y; }
Run Code Online (Sandbox Code Playgroud)
进而
int a[7];
transform((int *) 0, ((int *) 0) + 7, a, f);
Run Code Online (Sandbox Code Playgroud)
但我不会推荐它。:)
我们可以使用算法头文件中存在的generate函数。
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
vector<int>v(10);
int n=0;
generate(v.begin(), v.end(), [&n] { return n++;});
for(auto item : v)
{
cout<<item<<" ";
}
cout<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)