【发布时间】:2014-03-28 05:24:54
【问题描述】:
我有一个std::stringstream ss 和一个std::vector<string> list。
我想将push_back(或emplace_back)ss 转到list。
如何以最好的方式避免制作ss 的支持字符串的额外副本?
我的意图是立即运行ss.clear(),因为我将重新填充它(稍后附加到list...)
可能的选择:
list.emplace_back(std::move(ss.str())list.emplace_back(ss.str())list.push_back(std::move(ss.str())list.push_back(ss.str())
每种情况会发生什么?在每种情况下,ss 中会保留什么? (无论如何我都会扔掉它)
this topic 让我不确定该做什么。但问题是,我并没有将字符串流相互移动,我现在只特别担心能够移动作为字符串流构建的字符串(这可能是 巨大的 ) 放到一个字符串容器的后面。显然,如果str() 的实现方式会导致一些复制或转换,那是不可避免的,但希望我想生成能够在恒定时间内将其填充到我的向量后面的代码。
看了str()的实现:
template <class _CharT, class _Traits, class _Allocator>
basic_string<_CharT, _Traits, _Allocator>
basic_stringbuf<_CharT, _Traits, _Allocator>::str() const
{
if (__mode_ & ios_base::out)
{
if (__hm_ < this->pptr())
__hm_ = this->pptr();
return string_type(this->pbase(), __hm_, __str_.get_allocator());
}
else if (__mode_ & ios_base::in)
return string_type(this->eback(), this->egptr(), __str_.get_allocator());
return string_type(__str_.get_allocator());
}
然后更加困惑。
【问题讨论】:
-
你不需要调用
std::move(),因为ss.str()已经返回了一个右值。 -
如果我没记错的话,我需要一个 xvalue。
emplace_back也许可以强制执行此操作?或者其他的东西?我的理解很模糊。 (我认为这也可能是错误的。Emplace_back 将使用 args 构建一些内容以传递给类型的 ctor...这实际上是一个复制操作。不想要。) -
ss.str() 是一个拷贝右值,由std::vector的移动拷贝操作符移动
-
@Julius 什么是副本右值?右值引用?
-
如果其他阅读本文的人也对 emplace_back 感到困惑,这里有一个很好的讨论:stackoverflow.com/questions/4303513/push-back-vs-emplace-back
标签: c++ string c++11 stl stringstream