C++ 使用push_back和getline时如何减少临时对象?
我找到了关于如何使用C++ 使用push_back和getline时如何减少临时对象?,c++,list,constructor,getline,push-back,C++,List,Constructor,Getline,Push Back,我找到了关于如何使用std::getline(),以下是代码片段: std::istringstream input("abc|def|gh"); std::vector<std::array<char, 4>> v; for (std::array<char, 4> a; input.getline(&a[0], 4, '|'); ) v.push_back(a); std::istringstream输入(“abc | def | gh
std::getline()
,以下是代码片段:
std::istringstream input("abc|def|gh");
std::vector<std::array<char, 4>> v;
for (std::array<char, 4> a; input.getline(&a[0], 4, '|'); )
v.push_back(a);
std::istringstream输入(“abc | def | gh”);
std::向量v;
对于(std::array a;input.getline(&a[0],4'|');)
v、 推回(a);
我们可以发现a
是在for循环中构造的,它作为一个参数被传递到push_back
。有没有更好的方法来确保没有像a
这样的临时对象来避免开销
我发现了一个名为emplace\u back()
的成员函数,以减少临时对象的使用,但我不确定在这种情况下如何使用它,或者我应该将其留给编译器优化
有没有更好的方法来确保没有像a
这样的临时对象来避免开销
如果您提前知道向量的大小
,则可以创建一个具有已知大小的向量,并在调用getline
时使用该向量的预分配成员
size_t size = 10;
std::istringstream input("abc|def|gh");
std::vector<std::array<char, 4>> v(size); // Assuming size of the vector.
for ( size_t i = 0; i < size && input.getline(&v[i], 4, '|'); ++i ) {}
size\u t size=10;
标准::istringstream输入(“abc | def | gh”);
标准::向量v(大小);//假设向量的大小。
对于(size_t i=0;i
getline
需要有一个位置来将行放入,但是可以将该位置设置为v
向量中的新元素,从而避免使用额外的变量。用do/while
循环替换for
循环:
do {
v.emplace_back();
} while (input.getline(&v.back()[0], 4, '|'));
v.pop_back();
emplace\u back
取代了原始代码中的a
。我认为应该有一个v.pop\u back()