c++ - 动态创建 std::vector 并将其传递给另一个函数的各种方法
问题描述
我正在尝试各种std::vector
即时创建并将其传递给另一个函数的方法:
#include <iostream>
#include <vector>
void print(std::vector<int> a)
{
std::cout << a.size() << '\n';
}
int main()
{
print({1, 2, 3, 4, 5});
print(std::vector<int>{1, 2, 3, 4, 5});
print(std::vector<int>({1, 2, 3, 4, 5}));
}
这会产生所需的输出:
$ clang++ -std=c++11 foo.cpp && ./a.out
5
5
5
我想知道这三个调用之间有什么区别:
print({1, 2, 3, 4, 5});
print(std::vector<int>{1, 2, 3, 4, 5});
print(std::vector<int>({1, 2, 3, 4, 5}));
这是另一个例子:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> a = {1, 2, 3, 4, 5};
// std::cout << (a == {1, 2, 3, 4, 5}) << '\n'; // error
std::cout << (a == std::vector<int>{1, 2, 3, 4, 5}) << '\n';
std::cout << (a == std::vector<int>({1, 2, 3, 4, 5})) << '\n';
}
这是输出:
$ clang++ -std=c++11 foo.cpp && ./a.out
1
1
我希望这个问题的答案可以成为这个主题的一个很好的参考答案,其中答案讨论了这些调用的以下方面:
- 上述三种和任何其他类似的方式将 a 传递
std::vector
给另一个函数。 - 各种方法之间的语义差异。
- 各种方法之间的性能差异(如果有)。
- 一种调用优于另一种调用的最佳实践(如果有)。
如果您认为该问题有任何不足之处,请随时编辑该问题并加以改进。
解决方案
从 C++17 开始,所有这些都具有完全相同的效果。调用该print
函数并通过调用构造函数创建函数参数vector(std::initializer_list<int>)
。
第一个可能被认为是更可取的语法,因为它避免了冗余。
在 C++17 之前,可能已经创建和销毁了各种临时对象,但现在这一切都已成为过去。
推荐阅读
- reactjs - 如何在反应中创建饼图?
- mysql - 将 nodejs api 连接到 mariadb docker 容器
- python - 如何使用 TensorFlow 2 数据集从 URL 加载图像
- python - 如何在 Graph Networkx 中找到具有公共节点的边?
- python - 如何将图像添加到电子邮件正文_python
- java - 引用分配如何循环工作?在爪哇
- html - 如何解决 Angular 8 元数据中 require(URL-metadata) 的错误
- ios - iPhone 11 刺激器自动布局约束未按预期工作
- jsp - 如何收集日历期间?
- python - 如何在 python 中将多索引附加到我的数据框?