【问题标题】:c++11 vector initialization in a function callc++11 函数调用中的向量初始化
【发布时间】:2012-12-08 04:30:08
【问题描述】:

我有一个关于在 c++11 中定义向量的新快捷方式的问题。假设我有以下课程

struct Tester{

  vector< vector<int> > data;

  Tester(){
    data = vector< vector<int> >();
  }

  void add(vector<int> datum){
    data.push_back(datum);
  }

};

然后,以下工作按预期工作:

int main(){
    Tester test = Tester();
    vector<int> datum = vector<int>{1,2,3};
    test.add(datum);
}

但这不是:

int main(){
    Tester test = Tester();
    test.add(vector<int>{1,2,3});
}

有人可以向我解释一下区别吗?如何执行我在第二个 main() 中尝试的快捷方式?

【问题讨论】:

  • C++11 允许您在模板括号之间不留空格:vector&lt;vector&lt;int&gt;&gt; 是合法的。
  • 您还应该发布您在第二次尝试时遇到的错误。在我的脑海中,如果手头没有 C++11 编译器,我认为它可以只使用初始化列表 (test.add({1,2,3})) 或使用括号括起来 (test.add(vector&lt;int&gt;({1,2,3})))。
  • data = vector&lt; vector&lt;int&gt; &gt;(); 完全是多余的,可能会指出对 C++ 构造函数和初始化的根本误解。
  • 与错误无关,但您可以通过使用参考来避免add 方法中的潜在副本:void add(const vector&lt;int&gt;&amp; datum)

标签: c++ vector c++11


【解决方案1】:

您的代码似乎没问题,但您使用的编译器却不是(这似乎是旧的)。

顺便说一句,你做的太多了。

这就够了:

vector<int> datum{1,2,3}; //initialization

test.add({1,2,3}); //create vector<int> on the fly and pass it to add()

别忘了更新你的编译器。

另外,data = vector&lt; vector&lt;int&gt; &gt;(); 这行也太多了。它不是必需的。向量是自动构造的,这意味着您可以将类的构造函数留空,或者根本不拥有它,因为它不会做任何事情。

【讨论】:

  • 谢谢!这些都是不错的捷径。我同意不需要构造函数——我只是很明确。原来我的原始代码确实有效;我一定没有保存 emacs 缓冲区或其他东西。
【解决方案2】:

如果你想避免数据复制:

#include <vector>
#include <iostream>

using namespace std;

struct Tester
{
    vector< vector<int> > data;

    Tester()
    {
        data = vector< vector<int> >();
    }

    void add(vector<int> && datum)
    {
        data.push_back(std::move(datum));
    }

};


int main()
{
    Tester test = Tester();
    test.add(vector<int>{1,2,3});

    for(const auto &v : test.data[0])
        std::cout << v << std::endl;
}

【讨论】:

    猜你喜欢
    • 2018-09-30
    • 2016-10-12
    • 1970-01-01
    • 2013-02-19
    • 2016-03-21
    • 2018-03-15
    • 2018-10-11
    • 2015-06-09
    相关资源
    最近更新 更多