我正在尝试访问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对象的关联字符串的迭代器,并且行为是正确的吗?没有其他调用任何字符串流功能。怎么知道这是否安全?
答案 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确实减少了使迭代器无效的方法,但你在原始代码中也没有遇到问题。