5

Boost 的find_first算法是 C 算法的升级版strstr(),但是为什么大海捞针——搜索空间——作为非常量引用传入呢?匹配范围在单独的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& find_token)。

4

1 回答 1

11

这是为了确保调用后返回的范围仍然有效find_first

虽然上面的初始情况很好,但以下情况会导致 amatch指向已损坏的临时字符串:

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 是非常量的要求阻止它绑定到临时对象(右值),该对象在find_first' 返回时被销毁并使match' 的迭代器无效。

于 2012-11-21T19:01:32.157 回答