C++ STL标准模板库(pair set vector string stack queue map 使用详解)

pair

位于头文件<iostream>中用来表示一个二元组或元素对

使用pair

定义一个pair对象表示一个平面面坐标点:

pair<double, double> p;
cin >> p.first >> p.second;

pair模版类需要两个参数:首元素的数据类型和尾元素的数据类型。pair模版类对象有两个成 员:first和second,分别表示首元素和尾元素。 向上述q中存入数据需要用到q.make_pair(first,second); 对pair排序默认先为first,后second,如果需要先对second排序,需要设一个比较函数

int cmp(pair<int ,int > a,pair<int,int>b){
    return a.second > b.second;
}

set

使用set

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
set底层实现:红黑树
时间复杂度:
插入/查询:log(n)
*/
set<int> s;
set<double> ss;

set的基本操作:
s.begin() //返回指向第一个元素的迭代器
s.clear() //清除所有元素
s.count() //返回某个值元素的个数
s.empty() //如果集合为空,返回true(真)
s.end() //返回指向最后一个元素之后的迭代器,不是最后一个元素
s.erase() //删除集合中的元素
s.find() //返回一个指向被查找到元素的迭代器
s.insert() //在集合中插入元素
s.lower_bound() //返回指向大于(或等于)某值的第一个元素的迭代器
s.size() //集合中元素的数目
s.swap() //交换两个集合变量
s.upper_bound() //返回大于某个值元素的迭代器

vector

vector的基本操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
vector底层实现:数组
时间复杂度:
查询:
下标查询O(1)
值查询O(n)
插入O(n)
数据量较大时尽量不要使用vector,vector每一次内存不够之后都会申请双倍内存,然后将当前vector内所有内容拷贝新空间中
*/
#include<vector>
vector <int> s;
s[i] // 直接以下标方式访问容器中的元素
s.front() // 返回首元素
s.back() // 返回尾元素
s.push_back(x) // 向表尾插入元素x
s.size() // 返回表长
s.empty() // 表为空时,返回真,否则返回假
s.pop_back() // 删除表尾元素
s.begin() // 返回指向首元素的随机存取迭代器
s.end() // 返回指向尾元素的下一个位置的随机存取迭代器
s.clear() // 删除容器中的所有元素
s.swap(v) // 将s与另一个vector对象进行交换

string

string 可以赋值给char,但是char不能赋值给string string使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<string>
string s;

cin >> s;
s += "sada";
s.find("sa");
/*从左->右查找子串
返回子串首字母的下标。c11中可以定义auto 变量接收c11以下编译标准需定义迭代器接收返回值
查找不到返回npos(string中的宏定义)
判定指定子串是否存在:
if(s.find("sa")!=string::npos)
*******
下同
*/
s.rfind("sa"); //从右->左查找字串,
if(s[0] == 'a')
cout <<"s[0] == a"<<endll

stack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
stack底层实现:deque
*/
#include<stack>

stack<int> s;

a = 1;
s.push(1) //入栈;
s.pop() //出栈;
int Top = s.top() //访问栈顶
if(s.empty()==0) //判空,为空时返回1
cout << “非空” <<endl;
cout << s.size() <<endl;//访问栈中元素个数;

queue

下列表格中带*表示括号内无内容 否则括号内需要填要操作的元素 比如:

  • name.pop()
  • name.push(1)

DateType为任意数据类型

名字普通队列双端队列优先队列
头文件#include<queue>#include<deque>#include<queue>
声明queue<DateType> namedeque<DateType> namepriority_queue <DateType> name(默认 从小到大排序)
取出队首的值name.front()name.front(),name.back()name.top()
弹出元素(删掉,不取值)name.pop ()name.pop_back ()-> 弹出队尾 name.pop_front ()-> 弹出队首name.pop ()
存入元素name.push()name.push_back ()-> 存入队尾 name.push_front ()-> 存入队首name.push()
求队列中元素个数name.size ()name.size ()name.size ()

其中,优先队列还能够自定义优先级 这时我们可以传入一个比较函数

struct cmp{
    bool operator ()(int &a,int &b){
        return a<b;
    }
};

priority_queue<int, vector<int>,cmp > Queue;

其中 第二个参数为容器类型 第三个参数为比较函数


map

map为一个映射,相当于python中的字典 可以将map看作是由Key标识元素的元素集合,这类容器器也被称为“关联容器”,可以通过一个Key值来快速决定一个元素,因此非常适合于需要按照Key值查找元素的容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <map>
/*
set底层实现:红黑树
时间复杂度:
插入/查询:log(n)
*/
map <int,int >m;
m[key] = value;// [key]操作是map很有特色的操作,如果在map中存在键值为
key的元素对, 则返回该元素对的值域部分,否则将会创建一个键值为key的元素对,值域为默认值。所以可以用该操作向map中插入元素对或修改已经存在的元素对的值域部分。
//其实还有一种调用类函数insert的插入方法,但是既然map重载了[]运算符
//就只介绍了最简单的这一种
int i = m[key];
// 要注意的是,当与该键值相匹配的元素对不不存在时,会创建键值为key(当另一个元素是整形时,m[key]=0)的元素对。
map<string, int>::iterator it = m.find(key); // 如果map中存在与key相匹配的键值时,find操作将返
回指向该元素对的迭代器,否则,返回的迭代器等于map的end()(参⻅见vector中提到的begin()和end()
操作)。
//c11中可以用auto it = m.find(key);

m.erase(key);
// 删除与指定key键值相匹配的元素对,并返回被删除的元素的个数。
m.size();// 返回元素个数
m.empty();// 判断是否为空
m.clear();// 清空所有元素

觉得文章不错的话可以请我喝一杯茶哟~
  • 本文作者: bestsort
  • 本文链接: https://bestsort.cn/2019/04/28/461/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!并保留本声明。感谢您的阅读和支持!
-------------本文结束感谢您的阅读-------------