访问stringstream对象的关联字符串

时间:2011-01-18 19:18:41

标签: c++

我正在尝试访问stringstream对象的关联字符串并保留迭代器,但我不知道这是否安全。这是代码:

  stringstream HTMLss;   // string stream of HTML document

  // ... (load up HTMLss with HTML) 

  const string & HTMLstr = HTMLss.str();   // grab reference to associated string 
  string::const_iterator begin,end;
  begin = HTMLstr.begin();                 // grab iterators to that string as well
  end = HTMLstr.end();
  boost::match_results<std::string::const_iterator> matches;

  // do some processing, updating the iterators along the way
  while( boost::regex_search(begin, end, matches, metaexp) )
    {
      string key( matches[1].first, matches[1].second );
      string raw_val( matches[2].first, matches[2].second );

      // ... some processing which does NOT manipulate HTMLss stringstream in any way

      begin = matches[2].second;   // updating the iterator
    }

我的问题是 - 以上是安全的吗?可以假设一个人可以保留/更新指向stringstream对象的关联字符串的迭代器,并且行为是正确的吗?没有其他调用任何字符串流功能。怎么知道这是否安全?

3 个答案:

答案 0 :(得分:2)

仔细查看stringstream的str方法。它返回字符串的副本,而不是对字符串对象的引用。所以从理论上讲,只要你自己不改变字符串,你的迭代器就不会失效。

答案 1 :(得分:0)

这是安全的,但出于另一个原因而不是你想的那样。 HTMLss.str()返回内部字符串的副本,此副本绑定到const引用。根据C ++规则,绑定到本地const引用的临时值具有引用的生命周期。所以基本上你发布的代码几乎等同于:

string HTMLstr = HTMLss.str();

唯一的区别是这个版本可能会调用复制构造函数。这个电话可能会被优化掉。

答案 2 :(得分:0)

这将返回一个临时的生命周期扩展到HTMLstr的范围:

const string & HTMLstr = HTMLss.str();

因为这是HTMLss缓冲区的副本,所以后来对HTMLss所做的任何更改都不会被反映出来,但只要HTMLstr在范围内,就可以完全找到保留和使用HTMLstr的迭代器。

但是,您可以将HTMLstr设为非引用,但您可以保留const(或删除它):

const string HTMLstr = HTMLss.str();

保持const确实减少了使迭代器无效的方法,但你在原始代码中也没有遇到问题。