C++容器数据类型定义、测试用例

C++11 标准库提供了多种容器类型,每种容器定义了多个成员类型(如 value_typeiterator 等),用于与容器交互。以下详细说明各容器的数据类型定义、测试用例及注意事项。


一、顺序容器

1. std::vector<T>

类型定义

  • value_type: T
  • allocator_type: Allocator
  • size_type: size_t
  • difference_type: ptrdiff_t
  • reference: T&
  • const_reference: const T&
  • iterator: 随机访问迭代器
  • const_iterator: 常量随机访问迭代器

测试用例

复制代码
#include <vector>
#include <type_traits>

int main() {
    std::vector<int> vec = {1, 2, 3};

    // 使用类型定义声明变量
    std::vector<int>::value_type x = vec[0]; // x 是 int
    std::vector<int>::iterator it = vec.begin();
    std::vector<int>::const_iterator cit = vec.cbegin();
    std::vector<int>::size_type size = vec.size();

    static_assert(std::is_same<decltype(x), int>::value, "Error: x should be int");
    static_assert(std::is_same<decltype(it), std::vector<int>::iterator>::value, "Error");
    
    return 0;
}

2. std::list<T>

类型定义 :同 vector,但迭代器为双向迭代器。

测试用例

复制代码
#include <list>
#include <type_traits>

int main() {
    std::list<double> lst = {1.1, 2.2, 3.3};
    std::list<double>::iterator it = lst.begin();
    ++it; // 双向迭代器支持递增
    static_assert(std::is_same<decltype(it), std::list<double>::iterator>::value, "Error");
    return 0;
}

二、关联容器

1. std::map<Key, T>

类型定义

  • key_type: Key
  • mapped_type: T
  • value_type: std::pair<const Key, T>
  • key_compare: 比较函数类型
  • allocator_type: Allocator

测试用例

复制代码
#include <map>
#include <type_traits>

int main() {
    std::map<int, std::string> m = {{1, "one"}, {2, "two"}};

    std::map<int, std::string>::key_type k = 3; // k 是 int
    std::map<int, std::string>::mapped_type v = "three"; // v 是 std::string
    m.insert(std::map<int, std::string>::value_type(k, v));

    static_assert(std::is_same<decltype(m)::value_type, std::pair<const int, std::string>>::value, "Error");
    return 0;
}

三、无序容器

1. std::unordered_set<T>

类型定义

  • key_type: T
  • value_type: T
  • hasher: 哈希函数类型
  • key_equal: 键相等比较类型

测试用例

复制代码
#include <unordered_set>
#include <type_traits>

int main() {
    std::unordered_set<int> s = {1, 2, 3};
    std::unordered_set<int>::hasher h = s.hash_function();
    static_assert(std::is_same<decltype(s)::key_type, int>::value, "Error");
    return 0;
}

四、使用注意事项

  1. 迭代器失效

    • vector/deque 插入/删除可能导致迭代器失效。
    • list/关联容器 的插入不会使迭代器失效,删除仅影响被删元素对应的迭代器。
  2. 类型差异

    • map::value_typepair<const Key, T>,不可修改 Key
    • 无序容器的 key_type 必须支持哈希和相等比较。
  3. 分配器类型

    • 默认使用 std::allocator,高级场景可自定义分配器,需确保与容器兼容。
  4. 性能考量

    • vector 适合随机访问,list 适合频繁插入/删除。
    • 无序容器在键哈希均匀时提供 O(1) 访问。
  5. C++11 新特性

    • 使用 emplace 直接构造元素,避免拷贝。

    • 基于范围的 for 循环简化遍历:

      复制代码
      for (const auto& pair : map) { /* ... */ }

通过理解容器的数据类型定义,可以更安全高效地使用 STL 容器,避免类型错误和性能陷阱。

相关推荐
麦麦大数据6 小时前
MacOS 安装Python 3.13【同时保留旧版本】
开发语言·python·macos·python安装
上去我就QWER8 小时前
Qt中如何获取系统版本信息
开发语言·qt
我是苏苏9 小时前
C#高级:程序查询写法性能优化提升策略(附带Gzip算法示例)
开发语言·算法·c#
木木子99999 小时前
业务架构、应用架构、数据架构、技术架构
java·开发语言·架构
卓码软件测评12 小时前
第三方软件测试机构:【“Bug预防”比“Bug发现”更有价值:如何建立缺陷根因分析与流转机制?】
功能测试·测试工具·单元测试·测试用例·压力测试·可用性测试
南汐以墨12 小时前
BUG与测试用例
测试用例·bug
学涯乐码堂主13 小时前
GESP C++ 四级第一章:再谈函数(上)
c++·青少年编程·gesp·四级·学漄乐码青少年编程培训
微露清风14 小时前
系统性学习C++-第九讲-list类
c++·学习·list
大佬,救命!!!14 小时前
C++多线程同步与互斥
开发语言·c++·学习笔记·多线程·互斥锁·同步与互斥·死锁和避免策略
赵文宇(温玉)14 小时前
构建内网离线的“github.com“,完美解决内网Go开发依赖
开发语言·golang·github