在一行中使用带有“temp”结构的向量 push_back(如果可能)
Posted
技术标签:
【中文标题】在一行中使用带有“temp”结构的向量 push_back(如果可能)【英文标题】:Use of vector pushback with "temp" struct in one line (if possible) 【发布时间】:2013-11-13 18:44:59 【问题描述】:我有以下代码(为了使其小而具体):
struct myType_t
int a;
string str;
;
typedef vector<myType_t> dataVect_t; // Just for ease of use
...main(...)
dataVect_t myData;
myData.push_back((myType_t) 1, "test"); // THIS IS THE LINE IN QUESTION!
编辑:抱歉,这已更正为创建 myType_t 的实例(不是 dataVect_t)
我想将 intStringPairVect_t 的一个实例推回向量中,但我并不想为此创建一个变量。我正在做的事情似乎可以编译,但我不是 100% 相信它是正确的......这里有任何指针(没有双关语)吗?
【问题讨论】:
首先使用push_back
而不是pushback
。如果编译,你有一个相当奇怪的标准库。为什么您要转换为矢量类型而不是仅使用 myType_t
我仍然不清楚您的意图,但是按照编写的方式,即使修复了 push_back 也无法编译:No matching constructor for initialization of 'dataVect_t' (aka 'vector<myType_t>')
对不起,我就是这个意思,我是手写的,让它变小了……更正了:)
你应该避免在 C++ 中使用 C 风格的强制转换,尤其是当 type 是一个单词时
好点子,我不是故意要强制转换的,我的意思是构建和初始化一个临时实例,谢谢
【参考方案1】:
你想要这个
myData.push_back( myType_t 1, "test" );
~~~~~~~~
它使用统一初始化器来创建myType_t
的对象。
如果你不使用 C++11,那么你可以定义一个构造函数并通过 ()
做同样的事情:
struct myType_t
myType_t(int a, string str) : a(a), str(str)
int a;
string str;
;
myData.push_back( myType_t ( 1, "test" ));
【讨论】:
谢谢,是一样的还是有区别的? - 我假设这实际上是在构建一个临时实例? (我的不是?) 这是一个临时对象。你把这些对象弄错了:(dataVect_t)1,"test"
!
啊...我只是在投射“东西”而不是真正构建任何东西!,明白了:)
嗯...事实上这对我不起作用...这是 c++11 的功能吗? - 我没有使用 c++11...
@code_fodder 03x,但是是的。为myType_t
实现一个构造函数,如果您仅限于非03x c++,则使用myData.push_back( myType_t(1,"test") )
。【参考方案2】:
我会使用 emplace_back 而不是 push_back:
struct myType_t
myType_t(int a, string str) : a(a), str(str)
int a;
string str;
;
typedef vector<myType_t> dataVect_t; // Just for ease of use
main(...)
dataVect_t myData;
myData.emplace_back(1, "test"); // Emplacing directly.
这样您不必创建单独的变量,并且使用 emplace_back 而不是 push_back 更有效,因为这样向量不必复制您的 myType_t 实例。 (总的来说,我发现类型具有带有必要参数的显式构造函数是有益的。)
如果您的编译器不支持 emplace_back,您仍然可以将此方法与 push_back 一起使用:
main(...)
dataVect_t myData;
myData.push_back(myType_t(1, "test")); // Push back by creating an object.
此解决方案的唯一缺点是对象在插入向量时会被复制。
【讨论】:
谢谢你,我只是看看这个,它是一个 c++03x 功能,所以我不能在我的情况下使用它,但是 +1 因为这正是我真正想要的: ) 更新了我的答案,提供了有关在 push_back 中使用这种方法的信息。 hmm... 这个好像不能编译。我收到错误:no matching function call to std::vector...push_back(int, const char [3])
。我认为该函数需要单一数据类型...
对不起,我复制粘贴了忘记编辑,我现在更正了……如果你使用push_back,你必须写出类型的名称,所以和MM写的一样.以上是关于在一行中使用带有“temp”结构的向量 push_back(如果可能)的主要内容,如果未能解决你的问题,请参考以下文章