C++98
我认为需要考虑到 Meyers 声明指的是 c++98。今天很难说,但如果我没记错的话
- 为非 const 容器获取 const_iterator 根本不容易
- 如果你有一个 const_iterator 你几乎不可能使用它,因为容器成员函数的大多数(全部?)位置参数都应该是迭代器而不是 const_iterators
例如
std::vector<int> container;
本来需要
static_cast<std::vector<int>::const_iterator>(container.begin())
得到一个 const_iterator,它会大大夸大一个简单的 .find ,即使你有你的结果之后
std::vector<int>::const_iterator i = std::find(static_cast<std::vector<int>::const_iterator>(container.begin()), static_cast<std::vector<int>::const_iterator>(container.end()),42);
将无法使用您的 std::vector::const_iterator 插入到向量或任何其他预期位置迭代器的成员函数中。并且没有办法从 const 迭代器中获取迭代器。为此,不存在(存在?)铸造方法。
因为 const iterator 并不意味着容器不能改变,而只是指向的元素不能改变(const iterator 相当于指向 const 的指针),在这种情况下真的是一大堆废话.
今天恰恰相反。
const 迭代器很容易使用 cbegin 等。即使对于非 const 容器和所有(?)占据位置的成员函数都有 const 迭代器作为它们的参数,因此不需要任何转换。
std::vector<int> container;
auto i = std::find(container.cbegin(), container.cend(), 42);
container.insert(i, 43);
那么曾经是什么
更喜欢迭代器而不是 const_iterators
今天真的真的应该
更喜欢 const_iterators 而不是迭代器
因为第一个只是历史执行缺陷的产物。