Effective Modern C++读书笔记:条款13

Aki 发布于 2023-01-11 197 次阅读


13优先选用const_iterator,而非iterator :

const_iterator是STL中相当于const的指针的等价物,它们指向不可被修改的值。只要有可能就应该使用const的标准,实际表明,任何时候只要你需要一个迭代器而其指向的内容没有必要修改,你就应该使用const_iterator。

C++11以前,const_iterator没法直接完成到iterator的类型转换,即使是static_cast或者reinterpret_cast也不行。在C++11以后,const_iterator的处境得到了改善,容器的cbegin函数和cend函数都返回的是const_iterator,甚至对于非const的容器也是如此,并且STL成员函数若要取用指定位置的迭代器(例如用于插入或删除),它们也要求使用const_iterator类别。

std::vector<int> values; 
auto it = std::find(values.cbegin(), values.cend(), 1983);  
//it是 vector<int>::const_iterator 类型
values.insert(it, 1998);

C++14以后还提供了非成员函数的const_iterator,iterator类型。

cbegin(values);
cend(values);
crend(values);
crbegin(values);

begin(values);
end(values);
rbegin(values);
rend(values)

请记住:

  1. 优先选用const_iterator而非iterator
  2. 在最通用的代码中,优先选用非成员函数版本的begin和end和rebegin和rend等,而非其成员函数版本