1

我在 C++\STL 测试纸之一中注意到了这样一个问题。

有任何想法吗?

可能,这与以下事实有关,即删除集合中的元素会导致向量中的“全部删除后”迭代器失效,并且只有集合中删除的迭代器?

4

2 回答 2

4

这种差异更多地与容器的不同性质有关,而不是与迭代器本身有关。

一方面与这些容器的“已排序/未排序”性质有关:您不能修改位于已排序容器内的元素,因为它会影响顺序。

另一方面与“紧凑/扩展”存储机制有关:向量中的元素一起存储在单个分配块中,集合(或列表)中的元素单独存储。因此,向量中的插入/删除会导致元素位移的变化。在集合或列表中插入/删除只会导致重新链接,所有现有元素都保留其位置(因此不会使引用它们的迭代器无效)

另一个方面 - 总是与存储相关 - 是 vector::iterator 是“随机访问”: ++i, i+=3, i+=100 需要相同的时间,因为可以算术计算位移。在集合(和“链接容器”)中,迭代器只是“双向”:++i 和 --i 是立即计算的,但 i+=5 或 i+=100 需要完全不同的时间(至少需要线性循环)

于 2013-01-11T10:11:27.163 回答
3

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>

于 2013-01-11T09:52:25.247 回答