C++常用容器类型及其方法总结

本文介绍了C++中的标准顺序容器和关联容器,包括vector、list、queue、map和set等,并详细解释了各种容器的常用方法,如assign、back、begin、end、clear、erase、insert等。

C++常用的容器类型应该分为标准顺序容器和关联容器两个大的类型

标准顺序容器:vector、list、queue

关联容器:map、set

容器<Type>:Type是泛型表示你要存储在vector(容器)中的数据类型,这里的Type可以是常用的数据类型,也可以是自己定义的一些数据结构

几个容器中的常用方法:

assign()

back()返回一个引用

begin()获取第一个元素的位置,返回一个迭代器(可以为常量也可以不是常量)

end()获取最后一个元素的位置,返回一个迭代器(可以为常量也可以不是常量)

cbegin()和begin()相同,但是返回的迭代器只能是常量const_iterator

cend()和end类似,同样返回的迭代器只能是const_iterator

clear()清空容器

crbegin()返回反向列表的第一个值所在位置,返回类型为const_reverse_iterator

crend()....

emplace()、emplace_back()、emplace_front()

empty()判断容器是否为空

erase()删除对应位置上的值

insert()在容器的对应位置插入数值

max_size()返回容器的最大容量

merge()合并两个容器中的数据(这个方法应用于链表操作中,其它顺序容器中内存都是连续的不能用merge方法)

pop_back()、pop_front()从容器末尾、容器头删除数据

push_back()、push_front()从容器末尾、容器头向容器中添加数据

rbegin()、rend()和crbegin()crend基本相似但是这两个返回结果时可以不是常量迭代器的

remove()移除容器中某个特定的值(这个方法在vector中是不存在的)

remove_if(is_odd<Type>())移除容器中满足某一个条件的数值

resize()重新调整容器的大小

reverse()将容器元素翻转

size()返回容器中元素的个数

sort()/sort(greater<int>( ))对容器中的元素进行排序

swap()两个容器中的元素进行交换

splice()....

unique()移除连续相同的元素,比如10 10 20 10移除后的记过是10 20 10而不是10 20,所以在移除之前一般都要用sort进行排序操作,使相同的元素处于相邻的位置。





### C++ STL 常用容器及其方法总结 #### 一、字符串 `std::string` `std::string` 是一种动态扩展的字符数组,提供了丰富的成员函数来处理字符串。常见的操作包括: - **构造与赋值** - 构造:`std::string str = "example";` - 赋值:`str.assign("new example");` - **访问元素** - 获取单个字符:`char c = str.at(0);` 或 `c = str[0];` - 子串提取:`std::string subStr = str.substr(start, length);` - **修改字符串** - 插入:`str.insert(pos, otherString);` - 删除:`str.erase(pos, count);` - 替换:`str.replace(pos, count, newString);` 这些功能使得 `std::string` 成为了高效处理文本的理想选择[^1]。 --- #### 二、向量 `std::vector` `std::vector` 是一个动态数组,支持快速随机访问,适合需要频繁在末尾插入或删除元素的应用场景。 - **基本操作** - 添加元素到末尾:`vec.push_back(value);` - 移除最后一个元素:`vec.pop_back();` - 访问第一个和最后一个元素:`vec.front()` 和 `vec.back()` - 随机访问任意位置:`vec[index]` - **容量控制** - 当前大小:`size_t size = vec.size();` - 容量查询:`size_t capacity = vec.capacity();` - 扩展容量:`vec.reserve(newCapacity);` 注意,在调用 `erase` 方法时需特别小心迭代器失效问题[^3]。 --- #### 三、集合 `std::set` 和有序集 `std::multiset` `std::set` 提供了一个基于红黑树实现的有序集合结构,不允许重复键;而 `std::multiset` 则允许存在多个相同的键值。 - **主要方法** - 插入新元素:`mySet.insert(keyValue);` - 查找某个键是否存在:`bool found = mySet.find(key) != mySet.end();` - 删除指定键:`mySet.erase(key);` 由于底层采用平衡二叉查找树,其增删查改的时间复杂度均为 \(O(\log n)\)[^2]。 --- #### 四、队列 `std::queue` 及优先级队列 `std::priority_queue` - **普通队列** (`std::queue`) - 入队:`que.push(element);` - 出队并移除前端元素:`que.pop();` - 获取首尾元素:`frontElement = que.front();`, `backElement = que.back();` - **优先级队列** (`std::priority_queue`) 默认按照大顶堆排列。 - 插入元素:`pq.emplace(newValue);` - 返回最大值(默认行为):`topValue = pq.top();` - 弹出顶部元素:`pq.pop();` 这两种容器均属于适配器类型,因此它们本身并不支持迭代器[^4]。 --- #### 五、栈 `std::stack` `std::stack` 实现了后进先出 (LIFO) 的抽象数据类型。 - 栈的基本操作如下: - 推入新项至顶端:`stk.push(item);` - 弹出最上面的一项:`stk.pop();` - 查询当前顶部项目而不弹出:`currentTopItem = stk.top();` 同样作为容器适配器的一员,它也不具备迭代能力。 --- #### 六、双向队列 `std::deque` `std::deque` 支持两端高效的插入与删除动作,非常适合模拟滑动窗口等问题情境下的需求。 - 关键接口列举: - 向头部添加元素:`dqu.push_front(elem);` - 自尾部追加单元格:`dqu.push_back(elem);` - 清理头端节点:`dqu.pop_front();` - 去掉末端条目:`dqu.pop_back();` 尽管如此灵活多变,但在某些情况下可能会引发额外开销相比单纯线性表而言更高一点。 --- #### 七、映射表 `std::map` 和多重映射 `std::multimap` 类似于字典的数据结构形式,其中每一个 key 对应唯一 value (或者一组 values),内部通过 AVL/BST 来维持次序关系。 - 主要特性展示: - 新建关联对儿:`mp[key] = associatedData;` - 寻址定位某关键字所对应的数值:`mappedVal = mp.at(someKey);` - 迭代整个哈希表内容:利用范围for循环遍历所有键值组合。 对于性能敏感型应用来说,可能还需要考虑选用无序版本即 hash-based maps 如 unordered_map[]. --- ```cpp #include <iostream> #include <vector> #include <set> #include <queue> #include <stack> #include <deque> #include <map> using namespace std; int main(){ // Example of various containers usage. vector<int> v{1,2}; set<int> s; queue<int> q; stack<int> st; deque<int> dq; map<string,int> m; cout << boolalpha << (v.empty()) << endl; // Check if vector is empty [^2]. s.insert(7); q.push(8); st.push(q.front()); dq.push_back(st.top()); m["key"] = dq.front(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值