C++ STL容器指南:顺序、关联与无序容器一览

1. 顺序容器(Sequence Containers)

定义及特性

顺序容器按照特定顺序存储元素,顺序通常是插入元素的顺序。这些容器主要用于需要按照特定顺序访问和存储数据的场合。

常见类型
  • std::vector:动态数组,支持快速的随机访问,插入和删除操作在末尾是高效的。
  • std::deque:双端队列,支持在头部和尾部的高效插入和删除操作。
  • std::list:双向链表,支持常数时间插入和删除操作,但随机访问的效率低。
  • std::forward_list:单向链表,相对于 std::list 更轻量,但只能在头部快速插入和删除。
示例
#include <vector>
#include <deque>
#include <list>
#include <forward_list>
#include <iostream>

int main() {
    // std::vector 示例
    std::vector<int> vec = {1, 2, 3, 4};
    vec.push_back(5);
    for (int v : vec) {
        std::cout << v << " ";
    }
    std::cout << std::endl;

    // std::deque 示例
    std::deque<int> deq = {1, 2, 3, 4};
    deq.push_front(0);
    for (int d : deq) {
        std::cout << d << " ";
    }
    std::cout << std::endl;

    // std::list 示例
    std::list<int> lst = {1, 2, 3, 4};
    lst.push_back(5);
    for (int l : lst) {
        std::cout << l << " ";
    }
    std::cout << std::endl;

    // std::forward_list 示例
    std::forward_list<int> fw_lst = {1, 2, 3, 4};
    fw_lst.push_front(0);
    for (int f : fw_lst) {
        std::cout << f << " ";
    }
    std::cout << std::endl;

    return 0;
}

2. 关联容器(Associative Containers)

定义及特性

关联容器按键值对存储元素,能够提供基于键值的高效查找、插入和删除操作。关联容器通常使用红黑树或其他平衡树结构实现。

常见类型
  • std::set:包含唯一元素的集合,按照键值自动排序。
  • std::multiset:允许重复元素的集合,按照键值自动排序。
  • std::map:键值对集合,键唯一,按照键值自动排序。
  • std::multimap:键值对集合,键可以重复,按照键值自动排序。
示例
#include <set>
#include <map>
#include <iostream>

int main() {
    // std::set 示例
    std::set<int> s = {3, 1, 4, 1, 5, 9};
    for (int val : s) {
        std::cout << val << " ";  // 输出: 1 3 4 5 9
    }
    std::cout << std::endl;

    // std::map 示例
    std::map<int, std::string> m = {{1, "one"}, {2, "two"}, {3, "three"}};
    for (const auto& [key, value] : m) {
        std::cout << key << ": " << value << std::endl;
    }

    return 0;
}

3. 无序容器(Unordered Containers)

定义及特性

无序容器使用哈希表实现,提供常数时间复杂度的查找、插入和删除操作。顺序不定,因此与顺序容器和关联容器的有序特性不同。

常见类型
  • std::unordered_set:包含唯一元素的集合,不保证顺序。
  • std::unordered_multiset:允许重复元素的集合,不保证顺序。
  • std::unordered_map:键值对集合,键唯一,不保证顺序。
  • std::unordered_multimap:键值对集合,键可以重复,不保证顺序。
示例
#include <unordered_set>
#include <unordered_map>
#include <iostream>

int main() {
    // std::unordered_set 示例
    std::unordered_set<int> us = {3, 1, 4, 1, 5, 9};
    for (int val : us) {
        std::cout << val << " ";  // 输出顺序不定
    }
    std::cout << std::endl;

    // std::unordered_map 示例
    std::unordered_map<int, std::string> um = {{1, "one"}, {2, "two"}, {3, "three"}};
    for (const auto& [key, value] : um) {
        std::cout << key << ": " << value << std::endl;  // 输出顺序不定
    }

    return 0;
}

总结

1. 顺序容器
  • 用途:适合需要维护插入顺序的数据。
  • 常见类型std::vectorstd::dequestd::liststd::forward_list
2. 关联容器
  • 用途:适合需要快速查找和有序存储键值对的数据。
  • 常见类型std::setstd::multisetstd::mapstd::multimap
3. 无序容器
  • 用途:适合需要高效查找和不要求顺序的数据。
  • 常见类型std::unordered_setstd::unordered_multisetstd::unordered_mapstd::unordered_multimap

通过以上分类和详细解释,可以更好地理解和选择适当的 STL 容器,以优化 C++ 程序的性能和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值