使用 push_back 和 getline 时如何减少临时对象?

How to reduce the temp object when using push_back and getline?

我找到 an example 关于如何使用 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);

我们可以发现a是在for循环中构造的,并且作为参数传入push_back。有没有更好的方法来确保没有像 a 这样的临时对象来避免开销?

我找到了一个名为 emplace_back() 的成员函数来减少临时对象的使用,但我不确定在这种情况下如何使用它,或者我应该把它留给编译器优化?

Is there a better way to make sure there is no temporary object like a to avoid overhead?

如果您提前知道 vector 的大小,您可以创建一个已知大小的对象,并在对 getline.[=15= 的调用中使用向量的预分配成员]

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 ) {}

getline 需要一个位置来让行进入,但您可以使该位置成为 v 向量中的新元素,从而避免使用额外的变量。将 for 循环替换为 do/while 循环:

do {
    v.emplace_back();
} while (input.getline(&v.back()[0], 4, '|'));
v.pop_back();

emplace_back 取代了原始代码中的 a