繁体   English   中英

构造字符串向量时是否有任何副本?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM