STL容器之string、stack、queue、bitset

本文深入解析C++标准模板库(STL)中四种核心容器:字符串(string)、栈(stack)、队列(queue)和位集(bitset)的使用方法与特性。涵盖了从基本操作到高级功能的全面指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇:STL容器之set、map、unordered_set、unordered_map

1、字符串string

2、栈stack

3、队列queue

4、bit集bitset 


1、字符串string

=、assign()赋予新值
swap()交换两个string的内容
+=、append()、push_back()

添加字符。

str1.append(str2,1,3)表示将str2的从索引1开始的三个字符附加到str1;

str1.append("nico",5)表示将添加字符串数组:'n'  'i'  'c'  'o'  '\0';

str1.append(5, 'x') 表示添加5个x;

insert(index,str)

插入字符

erase()、pop_back()

删除字符

str.erase(13):删除第13个字符

str.erase(7, 5):删除第七个位置后的5个字符

clear()移除全部字符使之为空
resize()改变字符数量
replace(index,num,str2)替换字符,将str中重index开始的num个字符替换为str2
+串接string
==,!=,<=,>=,compare()

比较string,str1.compare(str2)中,返回0表示相等、小于0表示小于,大于0表示大于;

str1.compare(0, 2,str2,2, 2)表示比较str1的从0开始的2个字符和str2的从2开始的两个字符;

str1.compare(1,2,“bcx”,2)表示比较str1的从1开始的两个字符和“bcx”中的“bc”;

empty()判断字符是否为空
size()、length()返回字符的数量
max_size()返回字符的最大可能数

capacity()

返回重分配前的字符容量
reserve()保留一定容量内存以容纳一定数量的字符
shringk_to_fit()缩减字符使符合当前字符量
[]、at访问某个单一字符
front()、back()访问第一个、最末字符
>>,getline()从一个stream读取某值
<<将某值写入stream
stoi()、stol()、stoll()

将string转为带正负号的整数(int、long、long long),转换时会跳过前导的任何空白字符

    stoi(str,idxRet,base=10):第二个参数用于保存字符中未被处理的第一个字符索引,也就是字符串中的第一个无效字符,如果不关心则设置nullptr,第三个参数是数值的基数。

stoul()、stoull()将string转为不带正负号的整数(unsigned int、unsigned long long)
stof()、stod()、stold()将string转为浮点数(float、double、long double)
to_string(val)、to_wstring(val)将整数、浮点数转为string
const char c = 'a';
string s(1,c);        ---------------------
string s1;             ---------------------
s1.push_back(c); 
stringstream ss;  ---------------------
ss << c;
string str2 = ss.str();

将char转为string的三种方法:

  1.使用 string 的构造函数;

  2.声明string 后将char push_back;

 

  3.使用stringstream;

 

 

copy(buffer,num,beg_index)将string复制为一个字符数组
data()、c_str()将string的内容以C-string的内容返回
substr()

返回某个子字符串:

    str.substr(11):返回str的11个位置后的所有子串

    str.substr(5, 6) :返回str的第5个位置后的6个字符

find()

 

rfind()

find_first_of()

find_last_of()

find_first_not_of()

find_last_not_of()

查找第一个与val相等的字符串,返回索引;

    str1.find(str2,10):表示从str1的第10个位置开始查找

查找最后一个与val相等的字符串,返回索引;

查找第一个与val中的某值相等的字符串;

查找最后一个与val中的某值相等的字符串;

查找第一个与val中的任何值都不相等的字符串;

查找最后一个与val中的任何值都不相等的字符串;

begin()、end()提供正常的iterator支持
cbegin()、cend()提供const iterator支持
rbegin()、rend()提供reverse iterator支持
crbegin()、crend()提供const reverse iterator支持
get_allocator()返回分配器

2、栈stack

stack<string> stack初始化一个空的栈
stack.push(val)将一个元素放入stack之内
stack.top()返回stack的下一个元素,但并不移除它
stack.pop()从stack中移除元素,但并不返回它

3、队列queue

queue<string> queue初始化一个空队列
queue.push(val)将一个元素放入队列内
queue.front()返回队列的下一个元素(也就是第一个被插入的元素),但不移除它
queue.back()返回队列的最后一个元素(也就是最后一个被插入的元素),但不移除它
queue.pop()从队列中移除下一个元素,但并不返回它

4、bit集bitset 

bitset<n> b; 

bitset<n> b(u); 

bitset<n> b(s); 

bitset<n> b(s, pos, n); 

b有n位,每位都为0

b是unsigned long型u的一个副本

b是string对象s中含有的位串的副本

b是s中从位置pos开始的n个位的副本

b.any( ) 是否存在置为1的二进制位(和none()相反)
b.none( ) 是否不存在置为1的二进制位,即是否全部为0?和any()相反.
b.count( )二进制位为1的个数.
b.size( ) 二进制位的个数
b.flip() 把所有二进制位逐位取反
b.flip(pos) 把在pos处的二进制位取反
b[pos] 获取在pos处的二进制位
b.set() 把所有二进制位都置为1
b.set(pos) 把在pos处的二进制位置为1
b.reset() 把所有二进制位都置为0
b.reset(pos) 把在pos处的二进制位置为0
b.test(pos)在pos处的二进制位是否为1?
b.to_ulong( ) 用同样的二进制位返回一个unsigned long值
b.to_ullong()用同样的二进制位返回一个unsigned long long值
b.to_string ()返回对应的字符串.

参考:《C++标准》

<think>我们正在讨论C++STL容器的介绍和使用。根据引用内容,我们可以总结出STL容器是C++标准模板库的重要组成部分,在面试和实际开发中都有广泛应用。用户要求介绍和使用教程,因此我们需要系统性地介绍STL容器,包括常用容器(如vector,set,map,deque等)的特点、常用操作和示例代码。根据引用[1]和引用[3],STL容器包括顺序容器和关联容器,并且在使用时需要注意一些细节(如vector<bool>的问题)。引用[1]给出了一个set容器存储结构体的例子,引用[2]则提醒不要使用vector<bool>,可以用deque<bool>或bitset替代。我们将按照以下结构组织回答:1.STL容器概述2.顺序容器(vector,deque,list,array,forward_list)3.关联容器(set,multiset,map,multimap)4.无序关联容器(unordered_set,unordered_map等)5.容器适配器(stack,queue,priority_queue)6.使用注意事项(如vector<bool>的问题)在介绍每个容器时,我们会简要说明其特点,并给出基本的使用示例(包括定义、插入、删除、遍历等操作)。对于用户提供的set例子,我们可以直接使用。注意:用户提供的代码示例中有一个set存储结构体的例子,其中结构体重载了小于运算符,实现按a的值升序(注意代码中写的是`returna>W.a;`,但实际上这样写是按a的值降序,因为当当前元素的a大于比较元素的a时,当前元素会排在前面)。但代码注释写的是“按a的值升序”,这显然是错误的。我们在引用时应该指出这一点。另外,根据引用[2],我们要提醒避免使用vector<bool>。由于用户要求使用中文回答,并且按照格式要求,数学公式用$...$,独立公式用$$...$$(但本问题中可能涉及数学公式较少,主要是代码示例),我们将按照要求进行。最后,生成相关问题。现在开始组织回答:</think>### C++ STL容器介绍与使用教程 #### **1. STL容器概述** STL(Standard Template Library)提供了一系列**泛型容器**,分为三类: - **顺序容器**:元素按线性顺序存储(如 `vector`, `deque`, `list`) - **关联容器**:元素按键值排序(如 `set`, `map`) - **容器适配器**:基于其他容器的接口封装(如 `stack`, `queue`) #### **2. 核心容器详解** **(1) `vector` - 动态数组** ```cpp #include <vector> vector<int> v = {1, 2, 3}; v.push_back(4); // 尾部插入 v.pop_back(); // 尾部删除 for (auto i : v) cout << i << " "; // 遍历输出 ``` - **特性**:随机访问$O(1)$,尾部插入$O(1)$,中间插入$O(n)$ - **注意**:`vector<bool>` 非标准容器,建议用 `deque<bool>` 替代[^2] **(2) `set` - 有序唯一集合** ```cpp #include <set> set<int> s = {3, 1, 2}; // 自动排序 {1,2,3} s.insert(4); if (s.find(2) != s.end()) // 查找 s.erase(3); ``` **结构体存储示例**(需重载`<`运算符): ```cpp struct Node { int a, b; bool operator<(const Node& other) const { return a > other.a; // 按a降序排列 } }; set<Node> q = {{1,2}, {4,2}, {3,5}}; // 输出:4,2 -> 3,5 -> 1,2 [^1] ``` **(3) `map` - 键值对字典** ```cpp #include <map> map<string, int> m = {{"Alice", 90}, {"Bob", 85}}; m["Charlie"] = 95; // 插入 cout << m["Alice"]; // 访问 m.erase("Bob"); // 删除 ``` **(4) `deque` - 双端队列** ```cpp #include <deque> deque<int> dq = {2, 3}; dq.push_front(1); // 头部插入 dq.push_back(4); // 尾部插入 dq.pop_front(); // 头部删除 ``` #### **3. 容器选择指南** | 容器类型 | 适用场景 | 时间复杂度特性 | |----------------|-----------------------------------|------------------------| | `vector` | 随机访问频繁,尾部操作多 | 随机访问$O(1)$ | | `list` | 频繁中间插入/删除 | 插入/删除$O(1)$ | | `set/map` | 元素需自动排序且唯一 | 查找$O(\log n)$ | | `unordered_set`| 无需排序,快速查找(哈希实现) | 平均查找$O(1)$ | #### **4. 关键注意事项** 1. **迭代器失效**:`vector`插入元素可能使迭代器失效 2. **自定义排序**:关联容器存储自定义类型需重载`<`运算符 3. **内存管理**:`vector`扩容可能导致性能抖动,可预分配空间 4. **C++11新特性**:优先使用 `emplace_back()` 替代 `push_back()` 避免临时对象 > STL容器是C++面试重点考点,需掌握底层实现原理[^3]。例如`map`通常用红黑树实现,`unordered_map`用哈希表实现。 #### **5. 综合应用示例** ```cpp #include <iostream> #include <vector> #include <map> using namespace std; int main() { vector<int> nums = {5, 2, 8, 2, 5}; map<int, int> countMap; for (int num : nums) { countMap[num]++; // 统计频率 } for (auto& pair : countMap) { cout << pair.first << ": " << pair.second << "次\n"; } // 输出:2:2次 5:2次 8:1次 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值