stl简介

2020-12-27  本文已影响0人  voidFan

stl

stl简介

1. 什么是STL?

2. STL容器

container.png

1. 序列式容器:vector,deque,list

此外你也可以把 string 和 array 当做一种序列式容器
stack,queue(容器适配器),heap,priority_queue,slist

2. 四个关联式容器: set,map,multiset,multimap(底层都是红黑树)

从容器的底层存储结构和内部数据结构、随机访问元素及性能、增删元素性能进行分析。【迭代器失效、内存动态变化】

stl容器之vector

1. vector简介

2. vertor常用操作

2.1、增(定义、初始化)

#include<vector>             //头文件一定要有
using namespace std;         //其所在的命名空间
vector<int> vec;             //声明一个int型向量
vector<int> vecInit1(4,1);   //vec的内容为1,1,1,1
vector<int> vecInit2{ 1, 2, 3, 4, 5, 6 };   //vec内容1,2,3,4,5,6
vector<int> vecInit3(tmp);                   //声明并用tmp向量初始化vec向量 
int arr[5] = {1, 2, 3, 4, 5};   
vector<int> vecInit4(arr, arr + 5);         //将arr数组的元素用于初始化vec向量
vector<int> vecInit5(&arr[1], &arr[4]);     //将arr[1]~arr[4]范围内的元素作为vec的初始值

2.2、删

pop_back()   // 删除最后一个元素。
clear()      // 清除所有元素。
empty()      // 判断该数组是否为空
erase()      // 删除指定位置元素。
//(入参是指针变量(迭代器),比如begain(),end()),例如vec.erase(vec.begin()+2);  //删除第3个元素

2.3、改(插入)

vec.push_back(同类型量);  // 作用是在vector的末尾插入新元素;
insert()                 // 第一个参数为迭代器,作用为在迭代器前面插入新元素;
assign(5,1)              // 向vector中加入5个1,同时清除掉以前的元素。

2.4、查(遍历)

// 可以使用类似数组下标访问向量。
front()  // 访问第一个元素(第一个元素的值而不是地址!begin()相反)
back()   // 访问最后一个元素(最后一个元素的值而不是地址!end()相反)
size()   // 数组的元素个数

2.6、翻转与排序

#include <algorithm>
reverse(vec.begin(), vec.end())   //将元素翻转,即逆序排列!
sort(vec.begin(), vec.end());     //采用的是从小到大的排序
//如果想从大到小排序,可以采用上面反转函数,也可以采用下面方法:
bool Comp(const int& a, const int& b) {
    return a > b;
}
sort(vec.begin(), vec.end(), Comp);

2.7、二维向量

//C++ 构建二维动态数组
int **p;
p = new int*[10];                //注意,int*[10]表示一个有10个元素的指针数组
for (int i = 0; i < 10; ++i){
    p[i] = new int[5];
}
 
//用vector构建二维数组
vector<vector<int>> matrix;
vector<int>a;
a.push_back(1);
a.push_back(3);
a.push_back(1);
matrix.push_back(a);
//或者用下面的方法
int i,j;
vector<vector<int>> array(5);
for (i = 0; i < array.size(); i++)
    array[i].resize(3);//这里一定要使用resize其相当于每行的元素数并已经初始化过了

3. vertor注意点

迭代器中删除元素的操作时:对vector、queue等,每次erase操作,函数会删除指定迭代器位置的元素,然后将后面的元素前移一位,erase返回指向被删除元素下一元素的迭代器。(其实,我认为,返回的还是指定的迭代器,只不过它现在指向了被删除元素的下一元素,如有不对,恳请大家指正!)
对于erase操作,还有一种写法是:Vec.erase(itVec++)
不过需要注意,这种写法对vector、deque等容器无效!
上面两种写法,第一种对各种容器都有效,第二种写法只对map,list等容器有效。为了方便统一,还是建议采取第一种写法。

STL容器之set

1. set简介

set关联式容器。
set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一(集合内无重复相同的数据),而且系统能根据元素的值自动进行排序。
应该注意的是set中数元素的值不能直接被改变。
C++ STL中标准关联容器set, multiset, map, multimap内部采用的就非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。

关于set有下面几个问题

set使用方法

begin();     // 返回set容器的第一个迭代器
end();       // 返回set容器的最后一个迭代器
clear();     // 删除set容器中的所有的元素
empty();     // 判断set容器是否为空
max_size();  // 返回set容器可能包含的元素最大个数
size();      //返回当前set容器中的元素实现个数
rbegin();   // 返回的值和end()相同
rend();   // 返回的值和rbegin()相同

2. set常用操作

2.1、增删(定义、初始化、新增数据)

#include<vector>          //头文件一定要有
using namespace std;      //其所在的命名空间
set<int> s;               //声明一个int型集合
s.insert(1);

2.2、查 find(),返回给定值值得迭代器,如果没找到则返回end()

int arr[] = {1,2,3};
set<int> s(arr, arr+3);      //用数组初始化一个int型集合
set<int>::iterator iter;
if((iter = s.find(2)) != s.end()){
    cout<<*iter<<endl;
}

2.4、改

3. set注意点

pair<set<int>::const_iterator,set<int>::const_iterator> pr;  
pr = s.equal_range(3);
cout<<"第一个大于等于 3 的数是 :"<<*pr.first<<endl;  
cout<<"第一个大于 3的数是 : "<<*pr.second<<endl;
上一篇 下一篇

猜你喜欢

热点阅读