C++ vector的STL集成:与其他容器的协同工作
·
C++ vector的STL集成:与其他容器的协同工作
1. 基础数据交换
- vector与其他序列容器
通过迭代器范围实现与list、deque等容器的双向数据转移:std::vector<int> vec = {1, 2, 3}; std::list<int> myList; // vector → list myList.assign(vec.begin(), vec.end()); // list → vector vec.assign(myList.begin(), myList.end()); - 时间复杂度:$O(n)$,需遍历所有元素。
2. 与关联容器协同
- set/map → vector
利用关联容器的有序性直接转换:std::set<int> mySet = {3, 1, 2}; std::vector<int> vec(mySet.begin(), mySet.end()); // vec = {1, 2, 3}(自动排序) - vector → unordered_set
快速去重方案:std::vector<int> vec = {1, 3, 2, 3}; std::unordered_set<int> uniqueSet(vec.begin(), vec.end());
3. 算法库集成
- 通用算法应用
<algorithm>函数可跨容器操作:std::vector<int> vec = {5, 2, 8}; std::deque<int> deq = {1, 6, 4}; // 联合排序 std::sort(vec.begin(), vec.end()); // vec: {2,5,8} std::sort(deq.begin(), deq.end()); // deq: {1,4,6} // 合并到新vector std::vector<int> merged; std::merge(vec.begin(), vec.end(), deq.begin(), deq.end(), std::back_inserter(merged)); // merged: {1,2,4,5,6,8} - 数据拷贝
使用std::copy跨容器传输:std::vector<int> source = {10, 20}; std::list<int> target; std::copy(source.begin(), source.end(), std::back_inserter(target));
4. 容器适配器支持
- 自定义底层容器
stack/queue默认用deque,可指定vector:// 基于vector的栈 std::stack<int, std::vector<int>> vecStack; vecStack.push(42); // 基于vector的队列(需提供deque接口) std::queue<int, std::vector<int>> vecQueue; // 错误!queue需要pop_front()⚠️ 注意:
queue需要pop_front(),而vector未提供,通常用deque替代。
5. 性能优化实践
- 预分配空间
与其他容器交互前预留内存避免多次分配:std::set<int> largeSet = {...}; // 大量数据 std::vector<int> vec; vec.reserve(largeSet.size()); // 关键:避免扩容开销 vec.assign(largeSet.begin(), largeSet.end()); - 移动语义
C++11+ 中高效转移数据所有权:std::vector<std::string> vecA = {...}; std::vector<std::string> vecB; vecB = std::move(vecA); // vecA数据直接转移至vecB
6. 注意事项
- 迭代器失效
其他容器插入/删除时,原有迭代器可能失效,需重新获取。 - 复杂度差异
例如vector中间插入为$O(n)$,而list为$O(1)$,需根据场景选择协同方式。 - 类型兼容
容器元素类型必须匹配或可隐式转换。
总结:
vector通过迭代器抽象、算法库和构造/赋值接口,实现与STL容器的无缝协同。重点在于利用迭代器解耦数据操作,结合<algorithm>实现高效跨容器处理。
更多推荐
所有评论(0)