【问题标题】:Convention for returning from search algorithm - index or iterator从搜索算法返回的约定 - 索引或迭代器
【发布时间】:2015-01-13 05:10:55
【问题描述】:

我应该从字符串搜索算法返回迭代器还是索引?

我特别想遵守 C++ 的约定。 std::find 之类的模板函数返回一个迭代器,因为它必须这样做,因为某些容器不可索引。更专业的函数,例如 std::string::find 返回一个 size_t 索引。

检查失败是== x.end() 用于std::find== std::string::npos(通常为-1)用于专用版本。我认为迭代器检查方法更优雅。

在内部,出于性能和方便的原因,无论返回类型如何,我都会使用索引。

当我修复输入类型(std::string)时,每种返回方式的优缺点是什么?

【问题讨论】:

  • 如果您愿意,可以返回 std::pair<index,iterator>...
  • @vsoftco 听起来非常不合常规(无意冒犯)
  • @self,我同意,但是 STL 并不是完美内聚库的最佳示例。希望范围将使其成为标准。而std::string 就是一个完美的例子,迭代器和索引混合在接口中。如果我要编写函数,我会使用迭代器模式,因为大多数库都是基于迭代器的。而且,如果您想找到实际位置,可以使用 std::distance 和迭代器。
  • @vsoftco 关于std::string 的精彩观点@ stl 中的大多数算法都采用迭代器,<container>.begin(), <container>.end()。我发现这种模式是一致的。
  • @self 对,刚刚完成我的评论 :)

标签: c++ string string-matching calling-convention


【解决方案1】:

如果您想符合 STL(尽管即使 STL 的设计也不是很完美,std::string 是索引和迭代器混合在一起的典型示例),您应该使用迭代器。然后,可以使用std::distance 根据typename iterator_traits<InputIterator>::difference_type 查找位置(即,大多数情况下是std::size_t)。当然,这对于非随机访问迭代器会有O(n) 的开销,但它是最合规的方法。

希望在未来的范围内将其纳入标准库 http://www.boost.org/doc/libs/1_57_0/libs/range/doc/html/index.html

【讨论】:

    【解决方案2】:

    std::string 搜索成员函数的约定是返回 size_t 类型的索引,因为其他成员函数,例如 substrinserterase 会使用索引。其中一些也提供迭代器重载,但并非全部都提供。

    如果您计划将函数的输出与采用索引的 std::string 函数一起使用,请返回一个索引。如果您打算将函数的输出与接受迭代器的函数一起使用,请返回迭代器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-23
      • 2011-07-23
      • 2021-03-18
      • 2015-04-03
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      相关资源
      最近更新 更多