您现在的位置:首页 > 教案模板 > 正文

first对其输入采用非const引用?

2019-09-21 22:02 网络整理 教案网

boost string find_string find_std string find

百度翻译此文有道翻译此文

问 题

Boost's find_first algorithm is a souped-up equivalent of C's strstr(), but why does the haystack — the search space — get passed in as a non-const reference? The matching range is returned in a separate iterator_range object, so it's not a matter of output-by-reference.

It prevents invocation with a temporary range created by 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));

Instead, a local variable representing the source range must be created explicitly:

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));

(This applies equally to the other functions in , ie. find, ifind_first, find_last, ifind_last, find_nth, ifind_nth, find_head, find_tail & find_token).

解决方案

It's to ensure that the returned range is still valid after the call to find_first.

While the initial case above would be fine, the following would result in a match that points to a destroyed temporary string:

string find_std string find_boost string find

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"));

The requirement that the haystack be non-const prevents it binding to a temporary object (rvalue) which is destroyed upon find_first's return and invalidates the match's iterators.

本文地址:IT屋 » Why does boost::find_first take a non-const reference to its input?

问 题

Boost的 find_first 算法是一个等价的C的 strstr(),但为什么haystack—搜索空间作为非常量引用传递?匹配范围在单独的 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));相反,必须显式地创建表示源范围的局部变量:

$ p>
$ b
  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.hppboost string find,ie 。 find , ifind_first , find_last , ifind_last ,find_nthboost string find, ifind_nth code>, find_tail & find_token )。

解决方案

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

虽然上面的初始情况会很好,但下面的结果会导致指向一个被破坏的临时字符串的匹配 c>:

string find_boost string find_std string find

  boost :: sub_range< const std :: string>匹配= boost :: algorithm :: find_first(
boost :: make_iterator_range(std :: string(“haystack”),
boost :: make_iterator_range(std :: string(“stack”));

haystack是非常量的要求阻止它绑定到临时对象(rvalue)在 find_first 的返回并且使匹配的迭代器无效。

本文地址:IT屋 » 为什么boost :: find_first对其输入采用非const引用?

官方微信

扫一扫关注IT屋

微信公众号搜索 “ IT屋 ” ,选择关注

与百万开发者在一起

官方交流群:IT屋-技术交流群③

Google Facebook Youtube 科学上网》戳这里《

百度翻译此文有道翻译此文

问 题

std string find_boost string find_string find

Boost的 find_first 算法是一个等价的C的 strstr(),但为什么haystack—搜索空间作为非常量引用传递?匹配范围在单独的 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));相反,必须显式地创建表示源范围的局部变量:

$ p>
$ b
  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 ,ie 。 find , ifind_first , find_last , ifind_last , find_nth , ifind_nth code>, find_tail & find_token )。

解决方案

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

虽然上面的初始情况会很好,但下面的结果会导致指向一个被破坏的临时字符串的匹配 c>:

  boost :: sub_range< const std :: string>匹配= boost :: algorithm :: find_first(
boost :: make_iterator_range(std :: string(“haystack”),
boost :: make_iterator_range(std :: string(“stack”));

assign() 给list赋值 back() 返回最后一个元素 clear() 删除所有元素 empty() 如果list是空的则返回true end() 返回末尾的迭代器 erase() 删除一个元素 front() 返回第一个元素 get_allocator() 返回list的配置器 insert() 插入一个元素到list中 max_size() 返回list能容纳的最大元素数量 merge() 合并两个list pop_back() 删除最后一个元素 pop_front() 删除第一个元素 push_back() 在list的末尾添加一个元素 push_front() 在list的头部添加一个元素 rbegin() 返回指向第一个元素的逆向迭代器 remove() 从list删除元素 remove_if() 按指定条件删除元素 rend() 指向list末尾的逆向迭代器 resize() 改变list的大小 reverse() 把list的元素倒转 size() 返回list中的元素个数 sort() 给list排序 splice() 合并两个list swap() 交换两个list unique() 删除list中重复的元素。并且在实现输入迭代器间的 operator == 相等运算时,进行持有的流对象指针的相等比较,这样,默认创建的输入迭代器将被用于匹配输入流的结束。 类型特征 通过类型特征可以获得与一个类型相关联的其它数据类型 通过函数对象的类型特征可以得到函数对象的参数和返回值类型 通过迭代器的类型特征可以得到迭代器指向元素的类型 * 深度探索 函数对象的类型特征 stl提供的二元函数对象皆继承自以下结构体: template class arg1, class arg2, class result struct binary_function typedef arg1 first_argument_type。