c++11 函数调用中的向量初始化

Posted

技术标签:

【中文标题】c++11 函数调用中的向量初始化【英文标题】:c++11 vector initialization in a function call 【发布时间】: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) 【参考方案1】:

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

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

这就够了:

vector<int> datum1,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;

【讨论】:

以上是关于c++11 函数调用中的向量初始化的主要内容,如果未能解决你的问题,请参考以下文章

C ++没有匹配函数来调用向量中的擦除

[C++11]委托构造函数

如何通过使用自定义构造函数而不调用析构函数来创建具有初始大小的向量? [复制]

函数调用中的参数太多。 C++

用向量 c++ 中的指针成员初始化对象

C++ 从函数调用向量到 Main