C++常用容器内存分布情况

首先,强调一点,对象(如容器)本身的存储位置和其数据的存储位置往往不是在一起的,比如堆栈存储分离的模式。

先举个例子:vector和array

vector和array

  • array是c++11之后新加的容器类型,他比vector更加轻便。
  • array的数据存储在栈中,vector的数据存储在堆中。所以
    1. array容器处理数据的效率更快
    2. vector处理数据的量更大
  • vector更强大,封装的函数更多;array更轻便,更适合一些操作简单,数据量比较少的情况。

另外,其他的容器,智能指针等,其数据具体存放地点如下图:

<think>首先,用户的问题是:“我想了解C++常用容器类型及其使用方法 请问C++ 常用容器介绍及使用示例”。这需要我介绍C++常用容器类型,并提供使用示例。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但在这个上下文中,可能没有数学表达式,主要是代码和文本。 - 独立公式必须使用$$...$$格式并单独成段,但同样,这里可能不涉及数学公式。 - LaTeX语法正确:确保代码正确。 - 使用中文回答:整个回答要用中文。 - 生成相关问题:在回答结束后,添加相关问题。 - 回答中引用的段落末尾自然地添加引用标识:如[^1],但用户提供的引用是参考的,我需要自然地融入。 用户提供的引用: - [^1]: C++常用容器介绍,包括顺序容器概览。 - [^2]: C++ STL常用容器整理归纳,包括vector等。 - [^3]: C++常用容器以及应用案例,包括vector和unordered associative container。 这些引用是给我的参考,我需要基于这些内容来回答,确保回答真实可靠。 回答结构: - 结构清晰,逐步解决问题。 - 介绍常用容器类型。 - 提供使用示例。 - 结束时生成相关问题。 常用C++容器类型(基于引用): - 顺序容器:vector, list, deque, array等。 - 关联容器:set, map, multiset, multimap等。 - 无序关联容器:unordered_set, unordered_map等。 - 其他:stack, queue, priority_queue(适配器容器)。 从引用中提取关键点: - [^1]:提到顺序容器概览。 - [^2]:详细讲解vector, list, deque, set, map等。 - [^3]:提供vector和unordered关联容器的示例。 我需要覆盖主要容器: 1. vector 2. list 3. deque 4. array (C++11) 5. set 6. map 7. unordered_set 8. unordered_map 9. stack, queue, priority_queue(作为适配器) 为每个容器提供: - 简介:特点和使用场景。 - 使用示例:代码片段。 回答结构: 1. 引言:介绍C++ STL容器的重要性。 2. 顺序容器:vector, list, deque, array。 3. 关联容器:set, map。 4. 无序关联容器:unordered_set, unordered_map。 5. 容器适配器:stack, queue, priority_queue。 6. 总结。 7. 生成相关问题。 确保使用中文。 代码示例:使用代码块格式,如示例中的Python代码。 引用标识:在相关段落末尾添加[^1], [^2], [^3],自然地引用提供的参考。 生成相关问题:在回答结束时,添加“相关问题”部分。 最终输出格式: - 回答内容。 - §§相关问题§§ - 相关问题列表。</think>### C++常用容器介绍及使用示例 在C++编程中,标准模板库(STL)提供了多种容器类型,用于高效地存储和管理数据。这些容器基于不同的数据结构和算法,适用于各种场景,如动态数组、链表、映射等。下面我将逐步介绍C++中最常用容器类型,包括它们的特点、使用场景和具体代码示例。所有示例均基于C++11及以上标准,确保代码可编译运行。参考站内资源,容器分为顺序容器、关联容器、无序关联容器和适配器容器四大类[^1]。 #### 一、顺序容器 顺序容器按元素插入顺序存储数据,支持随机访问或顺序访问。常见类型包括vector、list、deque和array。 1. **vector(动态数组)** - **特点**:连续内存存储,支持快速随机访问(O(1)时间复杂度),动态调整大小(自动处理内存分配)。适用于频繁读取和尾部插入/删除的场景,但中间插入/删除较慢(O(n))。 - **使用示例**: ```cpp #include <vector> #include <iostream> using namespace std; int main() { // 初始化vector vector<int> vec = {1, 2, 3}; // 列表初始化 vec.push_back(4); // 尾部添加元素 vec[0] = 10; // 修改元素,索引访问 // 遍历输出 for (int i : vec) { cout << i << " "; // 输出: 10 2 3 4 } cout << endl; return 0; } ``` - 关键操作:`push_back()`、`pop_back()`、`size()`、`capacity()`(获取当前容量)[^3]。 2. **list(双向链表)** - **特点**:非连续存储,支持双向遍历,插入/删除元素高效(O(1)时间复杂度),但随机访问慢(O(n))。适用于需要频繁在中间插入/删除的场景。 - **使用示例**: ```cpp #include <list> #include <iostream> using namespace std; int main() { list<int> lst = {1, 2, 3}; lst.push_front(0); // 头部添加元素 lst.push_back(4); lst.pop_front(); // 删除头部元素 // 遍历输出 for (auto it = lst.begin(); it != lst.end(); ++it) { cout << *it << " "; // 输出: 1 2 3 4 } cout << endl; return 0; } ``` - 关键操作:`push_front()`、`push_back()`、`pop_front()`、`pop_back()`、`insert()`[^2]。 3. **deque(双端队列)** - **特点**:分段连续存储,支持快速随机访问和高效的头尾插入/删除(O(1)时间复杂度)。适用于需要两端操作的场景,如队列实现。 - **使用示例**: ```cpp #include <deque> #include <iostream> using namespace std; int main() { deque<int> dq = {2, 3, 4}; dq.push_front(1); // 头部添加 dq.push_back(5); dq.pop_front(); // 删除头部 // 遍历输出 for (int i : dq) { cout << i << " "; // 输出: 2 3 4 5 } cout << endl; return 0; } ``` - 关键操作:`push_front()`、`push_back()`、`pop_front()`、`pop_back()`[^1]。 4. **array(固定大小数组)** - **特点**:固定大小连续存储,编译时确定大小,无动态内存分配。适用于需要固定大小数组的场景,比C风格数组更安全。 - **使用示例**: ```cpp #include <array> #include <iostream> using namespace std; int main() { array<int, 3> arr = {1, 2, 3}; // 大小固定为3 arr[0] = 10; // 遍历输出 for (int i : arr) { cout << i << " "; // 输出: 10 2 3 } cout << endl; return 0; } ``` - 关键操作:`size()`、`fill()`(填充值)[^2]。 #### 二、关联容器 关联容器基于红黑树实现,元素自动排序,支持高效查找(O(log n)时间复杂度)。常见类型包括set和map。 1. **set(集合)** - **特点**:存储唯一键值,自动排序。适用于需要快速查找和去重的场景。 - **使用示例**: ```cpp #include <set> #include <iostream> using namespace std; int main() { set<int> s = {3, 1, 2}; s.insert(4); // 添加元素 s.erase(1); // 删除元素 // 遍历输出(自动排序) for (int num : s) { cout << num << " "; // 输出: 2 3 4 } cout << endl; return 0; } ``` - 关键操作:`insert()`、`erase()`、`find()`(查找元素)[^2]。 2. **map(映射)** - **特点**:存储键值对,键唯一且自动排序。适用于键值映射的场景,如字典。 - **使用示例**: ```cpp #include <map> #include <iostream> using namespace std; int main() { map<string, int> m; m["apple"] = 5; // 插入键值对 m["banana"] = 3; m["apple"] = 10; // 更新值 // 遍历输出 for (auto& pair : m) { cout << pair.first << ": " << pair.second << endl; // 输出: apple:10, banana:3 } return 0; } ``` - 关键操作:`insert()`、`erase()`、`operator[]`(访问或添加键)[^1]。 #### 三、无序关联容器 无序关联容器基于哈希表实现,元素无序,支持平均O(1)时间复杂度的查找。适用于不需要排序但需高效访问的场景[^3]。 1. **unordered_set(无序集合)** - **特点**:存储唯一键值,无排序,查找高效。 - **使用示例**: ```cpp #include <unordered_set> #include <iostream> using namespace std; int main() { unordered_set<string> us = {"apple", "banana"}; us.insert("orange"); us.erase("apple"); // 遍历输出(无序) for (const string& fruit : us) { cout << fruit << " "; // 输出可能: banana orange } cout << endl; return 0; } ``` 2. **unordered_map(无序映射)** - **特点**:存储键值对,键唯一,无排序。 - **使用示例**: ```cpp #include <unordered_map> #include <iostream> using namespace std; int main() { unordered_map<string, int> um; um["apple"] = 5; um["banana"] = 3; // 查找和输出 if (um.find("apple") != um.end()) { cout << "apple: " << um["apple"] << endl; // 输出: apple:5 } return 0; } ``` - 关键操作:`insert()`、`find()`、`erase()`[^3]。 #### 四、容器适配器 适配器容器基于其他容器实现,提供特定接口,如栈和队列。 1. **stack(栈)** - **特点**:后进先出(LIFO),默认基于deque实现。 - **使用示例**: ```cpp #include <stack> #include <iostream> using namespace std; int main() { stack<int> st; st.push(1); // 入栈 st.push(2); st.pop(); // 出栈 cout << "栈顶元素: " << st.top() << endl; // 输出: 1 return 0; } ``` 2. **queue(队列)** - **特点**:先进先出(FIFO),默认基于deque实现。 - **使用示例**: ```cpp #include <queue> #include <iostream> using namespace std; int main() { queue<int> q; q.push(1); // 入队 q.push(2); q.pop(); // 出队 cout << "队首元素: " << q.front() << endl; // 输出: 2 return 0; } ``` 3. **priority_queue(优先队列)** - **特点**:元素按优先级排序,默认最大堆,基于vector实现。 - **使用示例**: ```cpp #include <queue> #include <iostream> using namespace std; int main() { priority_queue<int> pq; pq.push(3); // 添加元素 pq.push(1); pq.push(2); cout << "顶部元素: " << pq.top() << endl; // 输出: 3(最大值) pq.pop(); // 删除顶部 return 0; } ``` - 关键操作:`push()`、`pop()`、`top()`[^2]。 #### 总结 C++容器提供了灵活的数据管理方式:顺序容器(如vector)适合随机访问,关联容器(如map)支持排序查找,无序关联容器(如unordered_map)优化哈希访问,适配器(如stack)简化特定操作。选择容器时,需考虑时间复杂度(如vector的O(1)访问 vs. list的O(1)插入)和内存开销。实践中,vector和unordered_map是最常用的组合[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Poo_Chai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值