我知道如何使用非平凡的初始值填充std :: vector,例如序号:
void IndexArray( unsigned int length, std::vector<unsigned int>& v )
{
v.resize(length);
for ( unsigned int i = 0; i < length; ++i )
{
v[i] = i;
}
}
但这是一个for循环。使用stl功能(不使用Boost)使用更少的代码行,是否有一种优雅的方法可以做到这一点?
答案 0 :(得分:15)
您可以使用generate算法,以更简单的方式填充容器:
#include <iostream>
#include <algorithm>
#include <vector>
struct c_unique {
int current;
c_unique() {current=0;}
int operator()() {return ++current;}
} UniqueNumber;
int main () {
vector<int> myvector (8);
generate (myvector.begin(), myvector.end(), UniqueNumber);
cout << "\nmyvector contains:";
for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
return 0;
}
这是从cplusplusreference无耻地解除和编辑的。
答案 1 :(得分:5)
我通常使用std::generate
加上一个简单的生成器:
template <typename T>
struct gen {
T x;
gen(T seed) : x(seed) { }
T operator ()() { return x++; }
};
generate(a.begin(), a.end(), gen<int>(0));
答案 2 :(得分:4)
如果您正在使用SGI STL(或衍生产品,例如STLPort),则可以使用iota
。 : - )
void IndexArray(unsigned int length, vector<unsigned int>& v)
{
vector<unsigned int>(length).swap(v);
iota(v.begin(), v.end(), 0);
}
答案 3 :(得分:2)
adobe.ASL中还有iota()
个功能,(以及value_iterator也是如此)。
在boost中,有一个counting_iterator,我怀疑还有其他一些方法可以在boost中动态生成数字序列。
答案 4 :(得分:1)
我知道这已经得到了解答,但我更喜欢算法库中的“填充”功能,因为我看起来更直观:
// fill algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main () {
vector<int> myvector (8); // myvector: 0 0 0 0 0 0 0 0
fill (myvector.begin(),myvector.begin()+4,5); // myvector: 5 5 5 5 0 0 0 0
fill (myvector.begin()+3,myvector.end()-2,8); // myvector: 5 5 5 8 8 8 0 0
cout << "myvector contains:";
for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
return 0;
}
这也被cplusplusreference无耻地解除了。
答案 5 :(得分:0)
如果你有一个C风格的数组,你可以使用std:copy,例如,
int c_array[] = {3,4,5};
const int* pbegin = &c_array[0];
const size_t c_array_size = sizeof(c_array) / sizeof(c_array[0]);
const int* pend = pbegin + c_array_size;
std::vector<int> v;
v.reserve(c_array_size);
std::copy(pbegin, pend, std:back_inserter(v));