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<vector<int>>
是合法的。
您还应该发布您在第二次尝试时遇到的错误。在我的脑海中,如果手头没有 C++11 编译器,我认为它可以只使用初始化列表 (test.add(1,2,3)
) 或使用括号括起来 (test.add(vector<int>(1,2,3))
)。
data = vector< vector<int> >();
完全是多余的,可能会指出对 C++ 构造函数和初始化的根本误解。
与错误无关,但您可以通过使用参考来避免add
方法中的潜在副本:void add(const vector<int>& 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< vector<int> >();
这行也太多了。它不是必需的。向量是自动构造的,这意味着您可以将类的构造函数留空,或者根本不拥有它,因为它不会做任何事情。
【讨论】:
谢谢!这些都是不错的捷径。我同意不需要构造函数——我只是很明确。原来我的原始代码确实有效;我一定没有保存 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 函数调用中的向量初始化的主要内容,如果未能解决你的问题,请参考以下文章