我可以创建一个数组并像这样初始化它:
int a[] = {10, 20, 30};
我如何创建一个std::vector和初始化它同样优雅?
我知道的最好的方法是:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
有没有更好的办法?
我可以创建一个数组并像这样初始化它:
int a[] = {10, 20, 30};
我如何创建一个std::vector和初始化它同样优雅?
我知道的最好的方法是:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
有没有更好的办法?
当前回答
在C++ 11之前:
方法1
vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
方法2
vector<int>v;
v.push_back(SomeValue);
下面的c++ 11也是可能的
vector<int>v = {1, 3, 5, 7};
我们也可以这样做
vector<int>v {1, 3, 5, 7}; // Notice .. no "=" sign
对于c++ 17以后,我们可以省略类型
vector v = {1, 3, 5, 7};
其他回答
typedef std::vector<int> arr;
arr a {10, 20, 30}; // This would be how you initialize while defining
编译使用:
clang++ -std=c++11 -stdlib=libc++ <filename.cpp>
我倾向于宣称
template< typename T, size_t N >
std::vector<T> makeVector( const T (&data)[N] )
{
return std::vector<T>(data, data+N);
}
在一个实用程序头的某处,然后所需要的是:
const double values[] = { 2.0, 1.0, 42.0, -7 };
std::vector<double> array = makeVector(values);
对于向量初始化-
vector<int> v = {10, 20, 30}
如果你有c++ 11编译器就可以做到。
否则,你可以有一个数据数组,然后使用for循环。
int array[] = {10,20,30}
for(unsigned int i=0; i<sizeof(array)/sizeof(array[0]); i++)
{
v.push_back(array[i]);
}
除此之外,在前面的回答中还描述了使用一些代码的各种其他方法。在我看来,这些方法容易记忆和快速书写。
B. Stroustrup在Prog. 11版的第464页的16.2.10 Selfreference中描述了一种很好的链式操作方法。朗。函数返回一个引用,这里修改为一个向量。这样你就可以像v.pb(1).pb(2).pb(3);但对于这样的小收获来说,工作量可能太大了。
#include <iostream>
#include <vector>
template<typename T>
class chain
{
private:
std::vector<T> _v;
public:
chain& pb(T a) {
_v.push_back(a);
return *this;
};
std::vector<T> get() { return _v; };
};
using namespace std;
int main(int argc, char const *argv[])
{
chain<int> v{};
v.pb(1).pb(2).pb(3);
for (auto& i : v.get()) {
cout << i << endl;
}
return 0;
}
1 2 3
最简单的方法是:
vector<int> ints = {10, 20, 30};