我在 C++\STL 测试纸之一中注意到了这样一个问题。
有任何想法吗?
可能,这与以下事实有关,即删除集合中的元素会导致向量中的“全部删除后”迭代器失效,并且只有集合中删除的迭代器?
这种差异更多地与容器的不同性质有关,而不是与迭代器本身有关。
一方面与这些容器的“已排序/未排序”性质有关:您不能修改位于已排序容器内的元素,因为它会影响顺序。
另一方面与“紧凑/扩展”存储机制有关:向量中的元素一起存储在单个分配块中,集合(或列表)中的元素单独存储。因此,向量中的插入/删除会导致元素位移的变化。在集合或列表中插入/删除只会导致重新链接,所有现有元素都保留其位置(因此不会使引用它们的迭代器无效)
另一个方面 - 总是与存储相关 - 是 vector::iterator 是“随机访问”: ++i, i+=3, i+=100 需要相同的时间,因为可以算术计算位移。在集合(和“链接容器”)中,迭代器只是“双向”:++i 和 --i 是立即计算的,但 i+=5 或 i+=100 需要完全不同的时间(至少需要线性循环)
aset::iterator
所指的对象是const
,因为不允许按顺序更改 a 中条目的值set
(并且允许更改值可能会破坏顺序)。对于vector::iterator
.
例如:
#include <vector>
#include <set>
int main()
{
std::set<int> s;
std::vector<int> v;
*v.begin() = 4;
*s.begin() = 4; // Line 10.
return 0;
}
MSVC++ 编译器发出:
main.cpp(10) : 错误 C3892: 'std::_Tree<_Traits>::begin' : 你不能分配给 const 的变量
g++ 编译器发出:
错误:分配只读位置 's.std::set<_Key, _Compare, _Alloc>::begin with _Key = int, _Compare = std::less, _Alloc = std::allocator.std::_Rb_tree_const_iterator<_Tp >::operator* with _Tp = int'</p>