C++11:将 POD 附加到 vector<> 的最有效方法

标签 c++ c++11 vector emplace

假设我有一个带有 int 的小结构, double , 和 std:string .
我有一个 vector这些结构中。
有效的 C 解决方案是分配数组,然后循环并设置字段的值。每个值只计算一次,并存储在它的最终位置。
在 C++11 中,我可以使用 emplace_back()避免在堆栈上创建临时结构,然后将其复制到 vector 内存中,并删除临时结构。但是我为 emplace_back() 提供了一个大括号括起来的初始化列表。并且编译器提示没有匹配的函数来调用 emplace_back用大括号括起来的初始化列表。
那么在这种情况下我必须编写一个三参数的公共(public)构造函数吗?如果我这样做了,它会和 C 版本一样高效吗?

最佳答案

既然你提到了结构而不是类,而且你还提到了 C,我怀疑你没有定义构造函数。
emplace_back你仍然在构建一些东西;你做到了,但你做到了。所以你需要提供构造函数。

#include <iostream>
#include <string>
#include <vector>

struct Foo {
    Foo(int i, double d, std::string s) : i(i), d(d), s(s) {};
    int i;
    double d;
    std::string s;
};

int main() {
    std::vector<Foo> v;
    v.emplace_back(1,2.5,"hello");
    std::cout << v[0].i << ' '
              << v[0].d << ' '
              << v[0].s << ' ';
}

关于C++11:将 POD 附加到 vector<> 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63567659/

相关文章:

c++ - 模板函数和 vector 访问

c++ - 将可执行文件加载到char vector 后,数据无效

c++ - mpi行列式,代码: 11 segmentation fault

c++ - QObject 中不可访问的转换

c++ - 失败时 C++ 中的 istream 行为更改

c++ - 为什么 std::shuffle 采用右值引用?

c++ - 在 Visual Studio 2012 中调试 C DLL 文件时无法单步执行代码

c++ - 如何检查是否单击了 QPushButton

c++ - 如何强制 MinGW 使用 tr1 命名空间?

c++ - 根据额外参数对 vector 进行排序