在一行中使用带有“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&lt;myType_t&gt;') 对不起,我就是这个意思,我是手写的,让它变小了……更正了:) 你应该避免在 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(如果可能)的主要内容,如果未能解决你的问题,请参考以下文章

使用带有向量和向量函数的模板

将“push_back”用于带有“get”函数C++的向量

用于向量中结构的 C++ 访问索引或使用引用而不是值

如何使用带有命令的向量列表来发送到 CreateProcess?

使用带有结构和指针的 temp

使用 push_back() 时指针向量指向 NULL