Boost的find_first
算法相当于C strstr()
,但为什么干草堆 - 搜索空间 - 作为非const 引用传入?匹配范围在单独的iterator_range
对象中返回,因此不是按引用输出的问题。
它可以防止使用make_iterator_range创建的临时范围进行调用。
const std::string str("haystack");
const std::string findstr("stack");
boost::sub_range<const std::string> match = boost::algorithm::find_first(
boost::make_iterator_range(str),
boost::make_iterator_range(findstr));
相反,必须明确创建表示源范围的局部变量:
const std::string str("haystack");
const std::string findstr("stack");
boost::sub_range<const std::string> haystack = boost::make_iterator_range(str);
boost::sub_range<const std::string> match = boost::algorithm::find_first(
haystack,
boost::make_iterator_range(findstr));
(这同样适用于boost/algorithm/string/find.hpp中的其他功能,即find
,ifind_first
,find_last
,ifind_last
,find_nth
, ifind_nth
,find_head
,find_tail
&amp; find_token
)。
答案 0 :(得分:11)
确保在调用find_first
之后返回的范围仍然有效。
虽然上面的初始案例没有问题,但以下情况会导致match
指向被销毁的临时字符串:
boost::sub_range<const std::string> match = boost::algorithm::find_first(
boost::make_iterator_range(std::string("haystack"),
boost::make_iterator_range(std::string("stack"));
haystack为非const的要求阻止它绑定到临时对象(rvalue),该临时对象在find_first
返回时被销毁并使match
的迭代器无效。