Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用push_back和getline时如何减少临时对象?_C++_List_Constructor_Getline_Push Back - Fatal编程技术网

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()