是否存在插入、删除操作均不会使引用失效的C++容器?
首先明确:C++标准库中存在符合要求的容器,所有满足要求的容器的共性是不会在操作时移动已存储的元素,仅会调整元素间的关联关系。所有「引用不失效」规则均针对非操作目标的元素,被删除元素本身的引用必然失效,属于正常逻辑。
符合要求的C++标准容器
- 链式序列容器
std::list:双向链表实现,任意位置的插入、删除操作,都仅会使指向被删除元素的引用、指针、迭代器失效,其余所有元素的引用保持有效。std::forward_list:单向链表实现,失效规则和std::list完全一致,仅在不需要双向遍历的场景下使用,内存开销比std::list略低。
- 有序关联容器
- 包括
std::set、std::map、std::multiset、std::multimap,底层通常为红黑树实现,插入、删除操作均不会影响除被删除元素外的其余元素引用有效性。
- 包括
- 无序关联容器
- 包括
std::unordered_set、std::unordered_map、std::unordered_multiset、std::unordered_multimap,底层为哈希表实现:插入操作如果触发重哈希,仅会导致迭代器失效,所有元素的指针和引用始终保持有效,删除操作仅失效被删元素的引用,完全满足需求。
- 包括
需要连续存储特性时的替代方案
如果业务同时需要元素连续存储的随机访问特性,上述容器的随机访问性能无法满足要求,可以采用以下两种方案实现引用稳定:
- 容器内存储智能指针:在
std::vector中存储std::unique_ptr<T>或std::shared_ptr<T>,容器扩容、插入、删除操作只会移动指针本身,实际存储的T对象内存地址不会变化,外部持有的T对象引用始终有效,仅被删除元素对应的引用失效,符合预期。 - 分块连续存储容器:自行实现或选用第三方实现的固定分块连续存储容器,扩容时仅新增存储块,不会移动已有块内的元素,所有元素引用始终有效,同时能做到接近
std::vector的随机访问性能。
内容的提问来源于stack exchange,提问作者jeffbRTC
相关产品推荐
相关产品推荐

