使用硬编码元素初始化 std::vector 的最简单方法是什么?
我可以创建一个数组并像这样初始化它:
int a[] = {10, 20, 30};
How do I create a std::vector 并同样优雅地初始化它?
我知道的最好的方法是:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
有更好的方法吗?
I can create an array and initialize it like this:
int a[] = {10, 20, 30};
How do I create a std::vector
and initialize it similarly elegant?
The best way I know is:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
Is there a better way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(29)
如果您的编译器支持 C++11,您可以简单地执行以下操作:
GCC 自版本 4.4 起提供此功能。不幸的是,VC++ 2010 在这方面似乎落后了。
或者, Boost.Assign 库使用非-macro magic 允许以下操作:
或者:
但请记住,这有一些开销(基本上,
list_of
在底层构造了一个std::deque
),因此为了性能-关键代码你最好按照雅科比所说的去做。If your compiler supports C++11, you can simply do:
This is available in GCC as of version 4.4. Unfortunately, VC++ 2010 seems to be lagging behind in this respect.
Alternatively, the Boost.Assign library uses non-macro magic to allow the following:
Or:
But keep in mind that this has some overhead (basically,
list_of
constructs astd::deque
under the hood) so for performance-critical code you'd be better off doing as Yacoby says.一种方法是使用数组来初始化向量
One method would be to use the array to initialize the vector
如果可以的话,请使用现代 C++[11,14,17,20,...] 方式:
循环遍历可变长度数组或使用
sizeof()
的旧方式在眼睛和精神上的开销完全没有必要。恶心。If you can, use the modern C++[11,14,17,20,...] way:
The old way of looping over a variable-length array or using
sizeof()
is truly terrible on the eyes and completely unnecessary in terms of mental overhead. Yuck.在 C++0x 中,您将能够以与数组相同的方式执行此操作,但在当前标准中不行。
仅在语言支持的情况下,您可以使用:
如果您可以添加其他库,您可以尝试 boost::assignment:
为了避免对数组的大小进行硬编码:
In C++0x you will be able to do it in the same way that you did with an array, but not in the current standard.
With only language support you can use:
If you can add other libraries you could try boost::assignment:
To avoid hardcoding the size of an array:
在 C++11 中:
使用 Boost
list_of
:使用 Boost 分配:
传统 STL:
具有通用宏的传统 STL:
具有向量初始值设定项宏的传统 STL:
In C++11:
Using Boost
list_of
:Using Boost assign:
Conventional STL:
Conventional STL with generic macros:
Conventional STL with a vector initializer macro:
我倾向于
在某个实用程序标头中声明,然后所需的就是:
I tend to declare
in a utility header somewhere and then all that's required is:
在 C++11 之前
我们还可以这样做:
自 C++11
使用 copy-list-初始化:
我们可以使用 direct-list-initialization 来完成此操作好吧:
从 C++17 开始
类模板参数推导 (CTAD) 让您省略模板参数:
Before C++11
We can also do:
Since C++11
Using copy-list-initialization:
We can do this using direct-list-initialization well:
Since C++17
Class template argument deduction (CTAD) lets you omit the template arguments:
开始于:
如果您没有 C++11 编译器并且不想使用 Boost:
如果您没有 C++11 编译器并且可以使用 Boost:
如果您有 C++ 11 编译器:
Starting with:
If you don't have a C++11 compiler and you don't want to use Boost:
If you don't have a C++11 compiler and can use Boost:
If you do have a C++11 compiler:
对于向量初始化 -
如果您有 C++11 编译器,则可以完成。
否则,您可以拥有一个数据数组,然后使用 for 循环。
除此之外,前面的答案中还使用一些代码描述了各种其他方法。在我看来,这些方式很容易记住,而且写起来也很快。
For vector initialisation -
can be done if you have a C++11 compiler.
Else, you can have an array of the data and then use a for loop.
Apart from these, there are various other ways described in previous answers using some code. In my opinion, these ways are easy to remember and quick to write.
最简单的方法是:
The easiest way to do it is:
如果您的编译器支持 Variadic 宏(对于大多数现代编译器来说都是如此),那么您可以使用下面的宏将向量初始化变成单行:
使用此宏,您可以使用如下代码定义一个初始化向量:
这将创建一个名为 my_vector 的新整数向量,其中包含元素 1、2、3、4。
If your compiler supports Variadic macros (which is true for most modern compilers), then you can use the following macro to turn vector initialization into a one-liner:
With this macro, you can define an initialized vector with code like this:
This would create a new vector of ints named my_vector with the elements 1, 2, 3, 4.
我使用
va_arg
构建自己的解决方案。该解决方案符合 C++98 标准。演示
I build my own solution using
va_arg
. This solution is C++98 compliant.Demo
如果你不想使用 Boost,但想享受语法,比如
只包含这段代码
If you don't want to use Boost, but want to enjoy syntax like
just include this chunk of code
在 C++11 中:
In C++11:
最近的重复问题有此答案,作者:维克托·塞尔。对我来说,它很紧凑,视觉上很有吸引力(看起来像是你在“塞入”值),不需要 C++11 或第三方模块,并避免使用额外的(写入的)变量。下面是我如何使用它并进行一些更改。我将来可能会转而扩展向量和/或 va_arg 的功能。
A more recent duplicate question has this answer by Viktor Sehr. For me, it is compact, visually appealing (looks like you are 'shoving' the values in), doesn't require C++11 or a third-party module, and avoids using an extra (written) variable. Below is how I am using it with a few changes. I may switch to extending the function of vector and/or
va_arg
in the future instead.您可以使用 boost::assign 来做到这一点:
详细信息在这里。
You can do that using boost::assign:
Details are here.
以下方法可用于在 C++ 中初始化向量。
int arr[] = {1, 3, 5, 6};矢量v(arr, arr + sizeof(arr)/sizeof(arr[0]));
向量v; v.push_back(1); v.push_back(2); v.push_back(3);
等等vectorv = {1, 3, 5, 7};
第三个仅在 C++11 及以上版本。
The below methods can be used to initialize the vector in C++.
int arr[] = {1, 3, 5, 6}; vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
vector<int>v; v.push_back(1); v.push_back(2); v.push_back(3);
and so onvector<int>v = {1, 3, 5, 7};
The third one is allowed only in C++11 onwards.
这里有很多很好的答案,但是由于我在阅读本文之前独立地得出了自己的答案,所以我想无论如何我都会把我的答案扔在这里......
这是我为此使用的一种方法,它将在编译器中通用和平台:
创建一个结构或类作为对象集合的容器。为
<<
定义运算符重载函数。您可以创建将结构体作为参数的函数,例如:
然后,您可以调用该函数,如下所示:
这样,您可以在一个干净的行中构建并将动态大小的对象集合传递给函数!
There are a lot of good answers here, but since I independently arrived at my own before reading this, I figured I'd toss mine up here anyway...
Here's a method that I'm using for this which will work universally across compilers and platforms:
Create a struct or class as a container for your collection of objects. Define an operator overload function for
<<
.You can create functions which take your struct as a parameter, e.g.:
Then, you can call that function, like this:
That way, you can build and pass a dynamically sized collection of objects to a function in one single clean line!
如果您想要与 Boost::assign 具有相同一般顺序的东西,而不创建对 Boost 的依赖,那么以下内容至少有点相似:
虽然我希望使用它的语法更清晰,但它仍然不是特别糟糕:
If you want something on the same general order as Boost::assign without creating a dependency on Boost, the following is at least vaguely similar:
While I wish the syntax for using it was cleaner, it's still not particularly awful:
编译使用:
To compile use:
在编写测试时,无需定义变量即可创建内联向量,非常方便,例如:
It is pretty convenient to create a vector inline without defining variable when writing test, for example:
“如何创建 STL 向量并像上面那样初始化它?以最少的打字工作量实现此目的的最佳方法是什么?”
初始化 STL 向量的最简单方法在初始化内置数组时,向量使用的是 C++11 中引入的初始化列表。
执行赋值(标记语句)后,ivec 的大小为 3 个元素。
"How do I create an STL vector and initialize it like the above? What is the best way to do so with the minimum typing effort?"
The easiest way to initialize a vector as you've initialized your built-in array is using an initializer list which was introduced in C++11.
ivec
is 3 elements in size after Assigning (labeled statement) is executed.有多种方法可以对向量进行硬编码。我将分享几种方法:
通过逐一推送值来初始化
像数组一样初始化
从数组初始化
从另一个向量初始化
There are various ways to hardcode a vector. I will share few ways:
Initializing by pushing values one by one
Initializing like arrays
Initializing from an array
Initializing from another vector
如果数组是:
If the array is:
相关的是,如果您想让向量完全准备好进入快速语句(例如立即传递给另一个函数),您可以使用以下内容:
示例函数
示例使用
,但要小心 decltype,确保第一个值清楚是什么你想要的。
Related, you can use the following if you want to have a vector completely ready to go in a quick statement (e.g. immediately passing to another function):
example function
example use
though be careful about the decltype, make sure the first value is clearly what you want.
B. Stroustrup 在 Prog 的 C++11 版本第 464 页的 16.2.10 Selfreference 中描述了一种链接操作的好方法。郎.其中函数返回引用,此处修改为向量。通过这种方式,您可以像
v.pb(1).pb(2).pb(3);
一样进行链接,但对于如此小的收益来说可能需要做太多的工作。B. Stroustrup describes a nice way to chain operations in 16.2.10 Selfreference on page 464 in the C++11 edition of the Prog. Lang. where a function returns a reference, here modified to a vector. This way you can chain like
v.pb(1).pb(2).pb(3);
but may be too much work for such small gains.最简单、符合人体工程学的方法(使用 C++ 11 或更高版本):
The simplest, ergonomic way (with C++ 11 or later):
如果您想在自己的班级中使用它:
In case you want to have it in your own class: