[英]Is there any copy when constructing a vector of strings?
以下代码将“我的字符串”拆分为vector<string>
:
std::stringstream ss{"my string"};
std::vector<std::string> vec;
std::string tmp;
while (std::getline(ss, tmp, ' ')) {
vec.push_back(tmp);
}
我的理解是getline
将其结果写入tmp
,然后tmp
通过复制它被推入向量中。 但是这样做会更有效吗vec.push_back(std::move(tmp))
所以我们避免复制?
我的理解是 getline 将其结果写入 tmp ,然后 tmp 通过复制它被推入向量中。
这是对的。 由于tmp
是左值,因此必须进行复制。
但是这样做会更有效吗
vec.push_back(std::move(tmp))
所以我们避免复制?
是的。 如果您使用move
,而不是复制整个字符串,您只需进行几个指针/整数交换。 这意味着它可以更快。 在每次迭代中使用getline
填充移动的字符串是安全的,因此无需担心( source )。
它不是更快的唯一方法是如果字符串具有短字符串优化,并且您放入字符串的数据足够短以符合它的条件。 然后你正在处理一个实际的字符数组,你必须做一个副本,因为 arrays 不能移动。
它的时间效率更高,而且内存效率略高。
无论哪种方式,您都在分配一些字符串。 移动临时字符串只会为循环的最后一次迭代减少一次分配。 但是,移动可以防止在每次迭代的位置之间复制 memory 内容的 CPU 和 RAM I/O 开销。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.