使用 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
。
我找到 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
。