【问题标题】:Various ways of creating std::vector on the fly and passing it to another function动态创建 std::vector 并将其传递给另一个函数的各种方法
【发布时间】:2018-05-20 03:00:45
【问题描述】:

我正在尝试各种即时创建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

希望这个问题的答案可以成为很好的参考 关于这个主题的答案,其中答案讨论了以下方面 这些调用:

  • 以上三种以及任何其他类似的方式通过 std::vector 到另一个函数。
  • 各种方法之间的语义差异。
  • 各种方法之间的性能差异(如果有)。
  • 最佳实践(如果有的话)由于一个调用是有利的 超过另一个。

如果您认为问题有任何不足之处,请随时编辑 问题并加以改进。

【问题讨论】:

  • @Someprogrammerdude 我不确定确切的术语,但根据this 可以认为是文字。
  • 没有向量“文字”。发生的事情是标准的list-initialization,使用std::initializer_list 和合适的std::vector constructor
  • 我确定我记得上周有一个非常相似的问题?
  • @user202729 这是一个 C++ 问题,这是一个 C# 问题。尽管名称表面上相似,但它们是完全不同的语言

标签: c++ vector parameter-passing semantics literals


【解决方案1】:

从 C++17 开始,所有这些都具有完全相同的效果。调用print 函数,并通过调用构造函数vector(std::initializer_list&lt;int&gt;) 创建函数参数。

第一个可能被认为是更可取的语法,因为它避免了冗余。

在 C++17 之前,可能已经创建和销毁了各种临时对象,但现在这一切都已成为过去。

【讨论】:

  • 在以下场景中是否也有同样的效果:std::vector&lt;int&gt; a = {1, 2, 3, 4, 5}; std::cout &lt;&lt; (a == std::vector&lt;int&gt;{1, 2, 3, 4, 5}) &lt;&lt; '\n'; std::cout &lt;&lt; (a == std::vector&lt;int&gt;({1, 2, 3, 4, 5})) &lt;&lt; '\n';?
  • @LoneLearner 是的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 2015-05-08
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多