假设我有一个带有 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/