0 结论
- 优先选择
const_iterator(一般用于不改变迭代器所指的数据),而非iterator; - 在最通用的代码中,优先选择非成员版本的begin、end和rbegin,而非成员函数版本。
1 论据
有些容器(如内建数组),或者类似的容器的数据结构会以非成员函数的方式提供begin和end(还有cbegin、cend和rbegin等),而不是以成员函数的方式提供。
成员函数形式:
std::vector<int> values;
auto it = std::find(values.cbegin(), values.cend(), 1983);
values.insert(it, 1998);
非成员函数版本:
template<typename C, typename V>
void findANdInsert(C& container, const V& targetVal, const V& insertVal){
using std::cbegin;
using std::cend;
auto it = std::find(cbegin(container), cend(container), targetVal);
container.insert(it, insertVal);
}
2 注意事项
在C++11中,仅添加了begin和end,没有添加cbegin、cend、rbegin、rend、crbegin和crend。这些问题都在C++14中得到了解决。
在C++11中解决的方法如下,例如cbegin,
template<class C>
auto cbegin(const C& container)->decltype(std::begin(container)){
return std::begin(container);
}
|