C++ vector的STL集成:与其他容器的协同工作

1. 基础数据交换
  • vector与其他序列容器
    通过迭代器范围实现与listdeque等容器的双向数据转移:
    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>实现高效跨容器处理。

更多推荐