我应该从字符串搜索算法返回迭代器还是索引?
特别是,我想遵守C++的惯例。模板化函数(如 std::find
)返回迭代器,因为它必须返回,因为某些容器不可索引。更专业的函数(如 std::string::find
)返回size_t
索引。
std::find
,故障检查== x.end()
,专用版本的检查== std::string::npos
(通常为 -1)。我认为迭代器检查方法更优雅。
在内部,无论返回类型如何,出于性能和便利原因,我都将使用索引。
当我修复输入类型(std::string
)时,每种返回方式的优点和缺点是什么?
如果你想符合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
std::string
搜索成员函数的约定是返回类型 size_t
的索引,因为其他成员函数(如 substr
、 insert
和 erase
采用索引。其中一些也提供迭代器重载,但并非所有迭代器重载都提供。
如果计划将函数的输出与采用索引的函数一起使用std::string
请返回索引。如果计划将函数的输出与接受迭代器的函数一起使用,请返回迭代器。