C++STL小结

1、vector——变长数组

倍增的思想

计算机申请空间的特点:花费时间与申请的大小无关,与申请速度有关(也就是和申请次数有关:申请1000个长度为1的空间花费时间可能是申请1个长度为1000的空间花费时间的1000倍)

//基本函数
vector<int> b;

b.size();//返回元素个数
b.empty();//判空
b.claer();//清空
front()/back(); //
push_back()/pop_back();
begin()/end();
[]支持随机存储
支持比较运算(按字典序比较)
#include <iostream>
#include <cstdio>
#include <csting>
#include <vector> 

using namespace std;

int main()
{
    //初始化
    vector<int> b(10, 3);
    //遍历方式1
    for(auto k:b) cout << k << endl;
    
    //用法
    vector<int> a;
 	
    for(int i = 0; i < 10; i++) a.push_back(i);
    //遍历方式2
    for(int i = 0; i < a.size(); i++) cout << a[i] << ' ';
    cout << endl;
    //遍历方式3
    for(vactor<int>::iterator i = a.begin(); i != a.end(); i++) cout << *i << ' ';
    cout << endl;
    
}

pair<T, T > —— 定义二元组

pair<T, pair<T, T>> ——定义三元组

//基本用法
first
second
支持比较(以first为第一关键字,以second为第二关键字,字典序)
    
pair<int, string> a;
//两种
a = make_pair(10, "abc");
a = {10, "abc"};

2、string——字符串

#include <iostream>
#include <string>

using namespace std; 

int main ()
{
	std::string s0 ("Hello World");  //根据已有字符串构造新的string实例
	
	//字符串长度 
	cout << "字符串长度:" << endl; 
	std::string s("1234567");
	std::cout << "size=" << s.size() << std::endl;
	std::cout << "length=" << s.length() << std::endl;     //size()和length():返回string对象的字符个数,他们执行效果相同。
	if(s[8] == '')
		std::cout << "yes" << std::endl;                   //数组越界访问,后一个为'',但在计算长度时会忽略'' 
	std::cout << "max_size=" << s.max_size() << std::endl; //max_size():返回string对象最多包含的字符数,超出会抛出length_error异常
	std::cout << "capacity=" << s.capacity() << std::endl; //capacity():重新分配内存之前,string对象能包含的最大字符数
	
	//C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),按照自左到右,按字典序比较
	cout << "字符串比较:" << endl; 
	string A("aBcdef");
	string B("AbcdEf");
	string C("123456");
	string D("123dfg");
	int m = A.compare(B);        //将A、B比较 
	int n = A.compare(1, 5, B);  //A的字串从1开始包含5个(Bcdef), 与B比较 
	int p = A.compare(1, 5, B, 4, 2);  //A的字串(Bcder),与B的字串(Ef) 
	int q = A.compare(0, 3, "abcd", 3);  //A的字串(aBc),与"abcd"的子串,前3个(123),不能是字符数组名 
	cout << "m=" << m << endl;    //1
	cout << "n=" << n << endl;    //1
	cout << "p=" << p << endl;    //-1
	cout << "q=" << q << endl;    //-1    1大, -1小, 0等于 

	//字符串初始化 
	cout << "字符串初始化:" << endl; 
	std::string s1;		//默认初始化,s1是个空字符串;
	std::string s2(s0);	//通过复制一个string构造一个新的string
	std::string s3(s0, 8, 3);//通过复制一个string的一部分来构造一个新的string。8为起始位置,3为偏移量。
	std::string s4 ("A character sequence"); //与s0构造方式相同。 
	std::string s5 ("Another character sequence", 12); //已知字符串,通过截取指定长度来创建一个string 
	std::string s6a (10, 'x'); //指定string长度,与一个元素,则默认重复该元素创建string 
	std::string s6b (10, 42); // 42 is the ASCII code for '*'  //通过ASCII码来代替s6a中的指定元素。 
	std::string s7 (s0.begin(), s0.begin()+7); //通过迭代器来指定复制s0的一部分,来创建s7
	
	std::cout << "s1: " << s1 << "
s2: " << s2 << "
s3: " << s3; 
	std::cout << "
s4: " << s4 << "
s5: " << s5 << "
s6a: " << s6a; 
	std::cout << "
s6b: " << s6b << "
s7: " << s7 << '
';
	
	//字符串更改
	cout << "字符串更改:" << endl; 
	string str7("123456");
	string str;
	str.assign(str7);             //将str7赋给str 
	cout << str << endl;
	str.assign(str7, 3, 3);       //str7从3开始3个(456)赋给str 
	cout << str << endl;
	str.assign(str7, 2, str7.npos); //str7从2开始到末尾(3456)赋给str 
	cout << str << endl;
	str.assign(5, 'X');            //把5个X赋给str 
	cout << str << endl;
	/*string::iterator itB = str7.begin();   
	string::iterator itE = str7.end();
	str.assign(itB, --itE);
	cout << str << endl << endl;*/   //迭代器
	str.clear(); 
	cout << str << endl;           //字符串清空s="";s.erase();
	//尾部添加
	cout << "尾部添加:" << endl; 
	str += str7;
	cout << str << endl;          //123456
	str += "789";
	cout << str << endl;          //123456789
	str += 'a';
	cout << str << endl;          //加1个字符, 123456789a
	str.append(str7);
	cout << str << endl;          //123456789a123456
	str.append(str7,1,3);
	cout << str << endl;		  //同前面的函数参数assign的解释(234),123456789a123456234
	str.append(str7,4,string::npos);
	cout << str << endl;		  //不解释了(56)  ,123456789a12345623456
	str.append("000");
	cout << str << endl;          //123456789a12345623456000
	str.append("nico",5);
	cout << str << endl;          //123456789a12345623456000nico
	str.append(5,'x');
	cout << str << endl;          //123456789a12345623456000nico xxxxx
	str.push_back('a'); 
	cout << str << endl;          //这个函数只能增加单个字符对STL熟悉的理解起来很简单 123456789a12345623456000nico xxxxxa
	str.clear();
	//插入
	cout << "插入:" << endl; 
	str.insert(0,"my name");
	cout << str << endl;  
    str.insert(1,str7);       //从1位置开始插入 
    cout << str << endl; 
	str.insert(6,1,'j');      //位置,个数,单个字符 
	cout << str << endl; 
    //删除
    cout << "删除:" << endl; 
    str.replace(1,2,"nternationalizatio");
	cout << str << endl; //从索引1开始的2个替换成后面的C_string
	str.erase(13);
	cout << str << endl; //从索引13开始往后全删除
	str.erase(7,5);
	cout << str << endl; //从索引7开始往后删5个
	//提取字串及字符串连接(就是+)
	cout << "提取:" << endl; 
	str.assign("abcdefghijklmnopqrstuvwxyz");
	string str1 = str.substr();
	cout << str1 << endl; //返回s的全部内容
	str1 = str.substr(11);
	cout << str1 << endl; //从索引11往后的子串
	str1 = str.substr(5,6);
	cout << str1 << endl; //从索引5开始6个字符 
	
	//字符串查找
	cout << "查找:" << endl; 
	str.assign("1234567890");
	int x = str.find("34", 0);
	cout << x << endl;     //查找字符串(34)(也可查询单个字符),并返回第一个字符的索引。第二个参数为开始查找起始位置。若查询失败返回-1。
	x = str.rfind("34");
	cout << x << endl;     //逆向查找字符串(34)(也可查询单个字符),并返回第一个字符的索引。第二个参数为开始查找起始位置。若查询失败返回-1。
	str.assign("1234563456340");
	x = str.find_first_of("34"); 
	cout << x << endl;     //查找字符串(34)(也可查询单个字符),并返回第一次出现的第一个字符的索引。若查询失败返回-1。
	x = str.find_last_of("34");
	cout << x << endl;     //查找字符串(34)(也可查询单个字符),并返回最后一次出现的第一个字符的索引。若查询失败返回-1。
	x = str.find_first_not_of("34");
	cout << x << endl;     //查找不是字符串(34)的字符串(也可查询单个字符),并返回第一次出现的第一个字符的索引。若查询失败返回-1。 
	x = str.find_last_not_of("34");
	cout << x << endl;     //查找不是字符串(34)的字符串(也可查询单个字符),并返回第一次出现的第一个字符的索引。若查询失败返回-1。 

	return 0;
}
//Output: 
//s1: 
//s2: Initial string 
//s3: str 
//s4: A character sequence 
//s5: Another char 
//s6a: xxxxxxxxxx 
//s6b: ********** 
//s7: Initial
 

3、queue——队列

//基本用法
size();
empty();
push(); //相队尾插入一个元素
front(); //返回队头元素
back(); //返回队尾元素
pop(); //弹出队头元素

4、priority_queue——优先队列(堆)

默认是定义大根堆。

//基本用法
push(); //插入一个元素
top(); //返回对顶元素
pop(); //弹出堆顶元素

//定义一个小根堆
(push(-x);)

priority_queue<int, vactor<int>, greater<int>> heap;

5、stack——栈

//基本用法
size();
empty();
push(); //向栈顶插入一个元素
top();  //返回栈顶元素
pop();  //弹出栈顶元素

6、deque——双端队列

效率非常低

//基本用法
size();
empty();
clear();
front();
back();
push_back()/pop_back();
push_front()/pop_front();
begin()/end();
[]支持随机存取

7、set、map、multiset、multimap

基于平衡二叉树(红黑树),动态维护有序序列

//set(不能有重复的数)/multiset(允许有重复的数)
size();
empty();
clear();
begin()/end();  //++,--返回前驱和后继,时间复杂度O(logn)

insert(); //插入一个数
find(); //查找一个数,若不存在返回end()
count(); //返回某一个数的个数
erase();
	(1)输入一个数x,删除所有x; O(k * logn)
	(2)输入一个迭代器,删除这个迭代器
lower_bound(); //返回大于等于x的最小的数的迭代器
upper_bound(); //返回大于x的最小的数的迭代器
//map/multimap
//将一个参数映射为另一个参数
size();
empty();
clear();
begin()/end();

insert(); //插入一个pair
erase(); //输入参数是pair或者迭代器
find();
[] // O(logn)
/* map<T1, T2> a[T1] = T2 */

8、unordered_set、unordered_map、unordered_multiset、unordered_multimap

基于哈希表

和上面类似,增删改查操作时间复杂度为O(1)

不支持lower_bound()和upper_bound(),迭代器的++、--

9、bitset

压位

//初始化
bitset<数量> s;
支持所有的位运算:~、&、|、^、<<、>>、==、!=
[]
count(); //返回有多少个1
any(); //判断是否至少有一个1
none(); //判断是否权威0

set(); //把所有位置1
reset(); //把所有位置0
set(k, v); //将第k位变成v
flip(); //等价于~
flip(k); //把第k为取反

原文地址:https://www.cnblogs.com/grain-rain/p/13492828.html