STL常用容器
本文最后更新于521 天前,其中的信息可能已经过时,如有错误请发送邮件到wdshine@126.com

1. string

1.1 基本概念

string是C++风格的字符串,本质上是一个类。在头文件 <string> 中。string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责。

string和char * 区别:

  • char * 是一个指针;
  • string是一个类,类内部封装了char * ,管理这个字符串,是一个char * 型的容器。

1.2 构造函数

string();                       // 创建一个空的字符串 例如: string str;
string(const char* s);          // 使用字符串s初始化
string(const string& str);      // 使用一个string对象初始化另一个string对象
string(int n, char c);          // 使用n个字符c初始化 

1.3 赋值操作

// string赋值方式较多,一般常用 = 进行赋值
string& operator=(const char* s);          // char*类型字符串 赋值给当前的字符串
string& operator=(const string &s);        // 把字符串s赋给当前的字符串
string& operator=(char c);                 // 字符赋值给当前的字符串

string& assign(const char *s);             // 把字符串s赋给当前的字符串
string& assign(const char *s, int n);      // 把字符串s的前n个字符赋给当前的字符串
string& assign(const string &s);           // 把字符串s赋给当前字符串
string& assign(int n, char c);             // 用n个字符c赋给当前字符串

1.4 字符串拼接

string& operator+=(const char* str);              // 重载+=操作符
string& operator+=(const char c);                 // 重载+=操作符
string& operator+=(const string& str);            // 重载+=操作符

string& append(const char *s);                    // 把字符串s连接到当前字符串结尾
string& append(const char *s, int n);             // 把字符串s的前n个字符连接到当前字符串结尾
string& append(const string &s);                  // 同operator+=(const string& str)
string& append(const string &s, int pos, int n);  // 字符串s中从pos开始的n个字符连接到字符串结尾

1.5 查找和替换

// 查找
int find(const string& str, int pos = 0) const;      // 查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const;          // 查找s第一次出现位置,从pos开始查找
int find(const char* s, int pos, int n) const;       // 从pos位置查找s的前n个字符第一次位置
int find(const char c, int pos = 0) const;           // 查找字符c第一次出现位置

int rfind(const string& str, int pos = npos) const;  // 查找str最后一次位置,从pos开始查找
int rfind(const char* s, int pos = npos) const;      // 查找s最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos, int n) const;      // 从pos查找s的前n个字符最后一次位置
int rfind(const char c, int pos = 0) const;          // 查找字符c最后一次出现位置

// 替换
string& replace(int pos, int n, const string& str);  // 替换从pos开始n个字符为字符串str
string& replace(int pos, int n,const char* s);       // 替换从pos开始的n个字符为字符串s

1.6 字符串比较

int compare(const string &s) const;    // 与字符串s比较,大于返回1,等于返回0,小于返回-1
int compare(const char *s) const;      // 与字符串s比较

1.7 直接操作串中字符

char& operator[](int n);      // 通过[]方式取字符
char& at(int n);              // 通过at方法获取字符

1.8 插入和删除

string& insert(int pos, const char* s);             // 插入字符串
string& insert(int pos, const string& str);         // 插入字符串
string& insert(int pos, int n, char c);             // 在指定位置插入n个字符c

string& erase(int pos, int n = npos);               // 删除从Pos开始的n个字符 

1.9 获取子串

string substr(int pos = 0, int n = npos) const;   // 返回由pos开始的n个字符组成的字符串

2. vector

2.1 基本概念

vector数据结构和数组非常相似,也称为单端数组。不同之处在于数组是静态空间,而vector可以动态扩展。动态扩展并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。

2.2 构造函数

vector<T> v;                       // 采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());          // 将v[begin(), end())区间中的元素拷贝给本身。
vector(n, elem);                     // 构造函数将n个elem拷贝给本身。
vector(const vector &vec);           // 拷贝构造函数。

2.3 赋值操作

vector& operator=(const vector &vec);   // 重载等号操作符

assign(beg, end);       // 将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);        // 将n个elem拷贝赋值给本身。

2.4 容量和大小

empty();                // 判断容器是否为空
capacity();             // 容器的容量
size();                 // 返回容器中元素的个数

resize(int num);        // 重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
                        // 如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);  // 重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
                        // 如果容器变短,则末尾超出容器长度的元素被删除

reserve(int len);       // 容器预留len个元素长度,预留位置不初始化,元素不可访问。

2.5 插入和删除

push_back(ele);      // 尾部插入元素ele
pop_back();          // 删除最后一个元素

insert(const_iterator pos, ele);            // 迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count,ele);  // 迭代器指向位置pos插入count个元素ele

erase(const_iterator pos)                           // 删除迭代器指向的元素
erase(const_iterator start, const_iterator end);    // 删除迭代器从start到end之间的元素

clear();            // 删除容器中所有元素

2.6 数据存取

at(int idx);      // 返回索引idx所指的数据
operator[];       // 返回索引idx所指的数据
front();          // 返回容器中第一个数据元素
back();           // 返回容器中最后一个数据元素

2.7 容器互换

swap(vec);      // 将vec与本身的元素互换

3. deque

3.1 基本概念

deque为双端数组,可以对头端进行插入删除操作。

deque与vector区别:

  • vector对于头部的插入删除效率低,数据量越大,效率越低
  • deque相对而言,对头部的插入删除速度回比vector快
  • vector访问元素时的速度会比deque快,这和两者内部实现有关

deque内部工作原理:

deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据

中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间

3.2 构造函数

deque deqT;             // 默认构造形式
deque(beg, end);           // 构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);            // 构造函数将n个elem拷贝给本身。
deque(const deque &deq);   // 拷贝构造函数

3.3 赋值操作

deque& operator=(const deque &deq);    //重载等号操作符

assign(beg, end);                      //将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);                       //将n个elem拷贝赋值给本身

3.4 容量操作

deque.empty();              // 判断容器是否为空
deque.size();               // 返回容器中元素的个数

deque.resize(num);          // 重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
                            // 如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem);    // 重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
                            // 如果容器变短,则末尾超出容器长度的元素被删除。

3.5 插入和删除

push_back(elem);         // 在容器尾部添加一个数据
push_front(elem);        // 在容器头部插入一个数据
pop_back();              // 删除容器最后一个数据
pop_front();             // 删除容器第一个数据

insert(pos,elem);        // 在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);      // 在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);     // 在pos位置插入[beg,end)区间的数据,无返回值。

clear();                 // 清空容器的所有数据

erase(beg,end);          // 删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);              // 删除pos位置的数据,返回下一个数据的位置。

3.6 数据存取

at(int idx);      // 返回索引idx所指的数据
operator[];       // 返回索引idx所指的数据
front();          // 返回容器中第一个数据元素
back();           // 返回容器中最后一个数据元素

4. queue

4.1 基本概念

queue为队列,是一种先进先出(First In First Out, FIFO)的数据结构,有两个出口。

队列容器允许从一端新增元素,从另一端移除元素。

队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为。

4.2 基本操作

// 构造函数
queue<T> que;               // queue采用模板类实现,queue对象的默认构造形式
queue(const queue &que);    // 拷贝构造函数

// 赋值操作
queue& operator=(const queue &que);     // 重载等号操作符

// 数据存取
push(elem);          // 往队尾添加元素
pop();               // 从队头移除第一个元素
back();              // 返回最后一个元素
front();             // 返回第一个元素

// 大小操作
empty();             // 判断队列是否为空
size();              // 返回队列的大小

5. stack

5.1 基本概念

stack为栈,是一种先进后出(First In Last Out, FILO)的数据结构,只有一个出口。

栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为。

5.2 基本操作

// 构造函数
stack<T> stk;                       // stack采用模板类实现, stack对象的默认构造形式
stack(const stack &stk);            // 拷贝构造函数

// 赋值操作
stack& operator=(const stack &stk);    // 重载等号操作符

// 数据存取
push(elem);      // 向栈顶添加元素
pop();           // 从栈顶移除第一个元素
top();           // 返回栈顶元素

// 大小操作
empty();         // 判断堆栈是否为空
size();          // 返回栈的大小

6. list

6.1 基本概念

list为链表,是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。链表由一系列结点组成,结点由存储数据元素的数据域和存储下一个结点地址的指针域组成。

STL中的链表是一个双向循环链表。由于链表的存储方式并不是连续的内存空间,因此链表中的迭代器只支持前移和后移,属于双向迭代器

list的优点:

  • 采用动态存储分配,不会造成内存浪费和溢出;
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素。

list的缺点:

  • 链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大。

List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。

STL中list和vector是两个最常被使用的容器,各有优缺点。

6.2 构造函数

list<T> lst;                  // list采用采用模板类实现,对象的默认构造形式
list(beg,end);                // 构造函数将[beg, end)区间中的元素拷贝给本身
list(n,elem);                 // 构造函数将n个elem拷贝给本身
list(const list &lst);        // 拷贝构造函数

6.3 赋值和交换

list& operator=(const list &lst);   // 重载等号操作符

assign(beg, end);            // 将[beg, end)区间中的数据拷贝赋值给本身
assign(n, elem);             // 将n个elem拷贝赋值给本身

swap(lst);                   // 将lst与本身的元素互换

6.4 大小操作

size();                 // 返回容器中元素的个数
empty();                // 判断容器是否为空

resize(num);            // 重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
                        // 如果容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem);      // 重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
                        // 如果容器变短,则末尾超出容器长度的元素被删除。

6.5 插入和删除

push_back(elem);        // 在容器尾部加入一个元素
pop_back();             // 删除容器中最后一个元素
push_front(elem);       // 在容器开头插入一个元素
pop_front();            // 从容器开头移除第一个元素

insert(pos,elem);       // 在pos位置插elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);     // 在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);    // 在pos位置插入[beg,end)区间的数据,无返回值。

clear();                // 移除容器的所有数据

erase(beg,end);         // 删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);             // 删除pos位置的数据,返回下一个数据的位置。

remove(elem);           // 删除容器中所有与elem值匹配的元素

6.6 数据存取

front();        // 返回第一个元素。
back();         // 返回最后一个元素。

6.7 反转和排序

reverse();   // 反转链表
sort();      // 链表排序

7. set / multiset

7.1 基本概念

set即集合,所有元素都会在插入时自动被排序。set/multiset属于关联式容器,底层结构是用二叉树实现。set容器默认排序规则为从小到大,利用仿函数可以改变排序规则。

7.2 构造和赋值

set<T> st;                // 默认构造函数:
set(const set &st);       // 拷贝构造函数

set& operator=(const set &st);    // 重载等号操作符

7.4 大小和交换

size();        // 返回容器中元素的数目
empty();       // 判断容器是否为空
swap(st);      // 交换两个集合容器

7.5 插入和删除

insert(elem);       // 在容器中插入元素。
clear();            // 清除所有元素

erase(pos);         // 删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);    // 删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);        // 删除容器中值为elem的元素。

7.6 查找和统计

find(key);       // 查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key);      // 统计key的元素个数

7.7 set和multiset区别

  • set不可以插入重复数据,而multiset可以
  • set插入数据的同时会返回插入结果,表示插入是否成功
  • multiset不会检测数据,因此可以插入重复数据

7.8 pair对组

// 成对出现的数据,利用对组可以返回两个数据
pair<type, type> p ( value1, value2 );
pair<type, type> p = make_pair( value1, value2 );

8. map / multimap

8.1 基本概念

map/multimap属于关联式容器,底层结构是用二叉树实现。map中所有元素都是pair,pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)。所有元素都会根据元素的键值自动排序,可以根据key值快速找到value值。

map容器默认排序规则为按照key值进行从小到大排序,利用仿函数可以改变排序规则。

map和multimap区别:

  • map不允许容器中有重复key值元素
  • multimap允许容器中有重复key值元素

8.2 构造和赋值

map<T1, T2> mp;                 // map默认构造函数
map(const map &mp);             // 拷贝构造函数

map& operator=(const map &mp);  // 重载等号操作符

8.3 大小和交换

size();        // 返回容器中元素的数目
empty();       // 判断容器是否为空
swap(st);      // 交换两个集合容器

8.4 插入和删除

insert(elem);       // 在容器中插入元素。
clear();            // 清除所有元素
erase(pos);         // 删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg, end);    // 删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器
erase(key);         // 删除容器中值为key的元素

8.5 查找和统计

find(key);        // 查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key);       // 统计key的元素个数
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇