stl总结

1.sort

头文件algorithm    sort(地址1,地址2)   排序算法,对地址1到地址2-1的数据排序
比较函数 cmp 可自定义比较规则
sort(v.begin(),v.end(),cmp);
bool cmp(object a,object b){
	return a.c>=b.c;//按照数据结构中c的大小排序,c大的排在前面,
	return a.c>b.c||(a.c==b.c&&a.d>b.d);//若两个对象的c值相等,则比较d
}

内置函数:
sort(s.begin(),s.end(),[&](char a,char b){
     return orders[a-'a']<orders[b-'a'];
});

在STL容器中,只有vector deque string 可以使用sort函数

//可以正常比较字符串,并且score值相同时按照字符串的升序排列(ASC码)
bool cmp(testee a,testee b){
    return a.score>b.score||(a.score==b.score&&strcmp(a.num,b.num)<0);
}
//无法正常比较,暂不知道原因
bool cmp(testee a,testee b){
    return a.score>b.score||(a.score==b.score&&a.num<b.num);
}

2.string

使用cin读取字符串,读到空格会断开。如果要读取一整行字符串,可以使用getline(cin,s)
头文件  string    STL string    C语言中用指针或者数组定义字符串,用指针打印
	C++中直接用cout打印
	获取一行字符串: cin和scanf遇到空格都会结束,获取一行字符,可以用getline(cin,字符串)
	+=  可以连接字符串。如果连接的是整型数据,会读入asc码对应的数字


	s.begin() 字符串第一个字符的地址
	s.end()字符串最后一个字符后面的地址
	删除第一个字符:s.erase(s.begin());
	删除最后一个字符:s.erase(--s.begin());
	s.substr(索引,长度)  返回取完之后的结果(索引从0开始)长度为-1时,切片取字符串,截断到最后
	s.substr()//截取整个字符串
	s.substr(5,7)  //从5开始,截取7个字符。如果剩下的不足7个字符,截取到最后
	s.substr(5) // 从5开始,截取到最后

字符串比较可以直接使用 > < =,也可以使用compare函数

int compare(const string &s) const; //与字符串s比较
int compare(const char *s) const; //与字符串s比较

字符串逆序:#include
reverse(a.begin(),a.end());

删除第一个字符:s.erase(s.begin())

使用单个字符构造字符串:string(1,c);

遍历字符串
1.s.length()for循环遍历
2.迭代器
	string::iterator it=s.begin();it!=s.end();it++

	auto it=s.begin();it!=s.end();it++
		auto 不受类型限制

	for(auto x:s)
		cout<<x;
### 3.vector
```cpp
	vector
		1.vector<int> v; 定义一个空的vector
		  vector<int>v2(4); 定义大小为4的vector,元素都初始化为0
		  vector<int>v2(4,6); 定义大小为4的vector,元素都初始化为6
		  vector<int>v3{1,2,3,4,5};
		  vector<int>new(old); 使用vector初始化vector。
		2.遍历:
			for(auto x:v)
				cout<<x;

			for(i=0;i<v.size();i++)
				cout<<v[i];

			for(vector<int>::iterator it=v.begin();it!=v.end();it++)
				cout<<*it;

			for(auto it=v.begin();it!=v.end();it++)
				cout<<*it;

		3.获取元素: 取索引为i的元素
		v[i]
		v.at(i)
		4.建立n行m列的矩阵:
		vector<vector<int>>matrix;
		matrix.resize(n,vector<int>(m));
		5.插入元素
		v.insert(v.begin(),x);//在最前面插入新元素
    	v.insert(v.begin()+i,1);//在迭代器中下标为i的元素前插入新元素
    	v.insert(v.end(),x);//在向量末尾追加新元素
    	v.insert(v.end(),count,x);//在尾部插入count个x
		6.方法
			v.push_back(元素)
			v.resize(长度)重置大小,不赋值,默认为0
			v.erase(地址) 删除元素,复杂度为O(n)
			v.erase(v.begin())删除第一个元素
			v.erase(--v.end())删除最后一个元素
			v.erase(v.begin()+i)删除第i个元素
			v.size() 获取大小
			取第一个元素:v.front()  *v.begin()    v[0]   
			取最后一个元素:v.back()   *(--v.end())  v[v.size()-1]
			accumulate(vec.begin() , vec.end() , 初始值)   可用来求容器内所有元素的和或者连接字符串。
		7.求最大值最小值
			min=*min_element(bloomDay.begin(),bloomDay.end());
			max=*max_element(bloomDay.begin(),bloomDay.end());
		8.iota(v.begin(),v.end(),0); 对vector进行批量递增赋值。最后一个参数是初始值
	排序:第三个参数为比较器,不写默认为less
	sort(v.begin(),v.end())从小到大排序  sort(v.begin(),v.end(),less<int>())
	sort(v.begin(),v.end(),greater<int>()) 从大到小排序

4.stack

	stack
		0.不能用是s[i]获取元素
		1.构造stack   stack<int> s;
		2.s.push(元素)
		3.s.top()只能取,不弹出
		4.s.pop()弹出栈顶元素,无返回值
		5.s.size()获取大小
		6.s.empty()判断是否为空
		7.进制转换
			int itob(int damical)
			{
				stack<int> s;
				int res;
				while(demical!=0)
				{
					res=res*10+s.top;
					s.pop();
				}
				return res;
			}
		8.逆序单词  将一个句子中的单词逆序输出,单词中的字母正序输出
			fun()
			{
				stack<string> s;
				string str;
				getline(cin,str);
				stringstream ss;   输入输出流
				ss<<str;
				while(ss>>str)
				{
					s.push(str);
				}
				while(!s.empty())
				{
					cout<<s.top();
					if(s.size()!=1)      //s.size()=1时,栈中只有最后一个元素 保证最后没有多余的空格
						cout<<" ";
					s.pop();
				}
			}
		9.字符串转数字
			1)
			fun()
			{
				string s="1234";
				stringstream ss;
				int i;
				ss<<s;
				ss>>i;
				cout<<i;
			}
			2)
			fun()
			{
				string s="1234";
				int i=stoi(s);
				cout<<i;
			}
		10.数字转字符串
			1)
			fun()
			{
				int a=1234;
				string out;
				stringstream ss;
				ss<<a;
				ss>>out;
			}
			2)
			int a=1234;
			to_string(a)

5.queue

	queue
	queue<int> q;
	q.push(); 
	q.pop();
	q.size();
	q.front();

6.map

	map map的底层是树形结构,是有序的
           first  second    first是索引,按索引排序
		1.map<int,int> m;
		  m[6]=3;
		  m[5]=8;
		  m[4]=9;
		  for(auto it=m.begin();it!=m.end();it++)           it是指针,temp是成员
			  cout<<it->first<<" "<<it->second<<endl;
		  for(auto temp:m)
			  cout<<temp.first<<" "<<temp.second<<endl;
		 for (auto& [_, c] : m) {
             cout<<c;//second
         }
			4 9
			5 8
			6 3
		2.unorder_map<int,int>m;与map的区别是:无序 是hash结构
			按索引从大到小排序:
			bool cmp(pair<int,int>a,pair<int,int>b)
			{
				return a.first>b.first;
			}
			fun()
			{
				unorder_map<int,int>m;
				m[6]=3;
				m[5]=8;
				m[4]=9;
				vector<pair<int,int>> v(m.begin(),m.end());
				sort(v.begin(),v.end(),cmp);
				for(auto temp:v)
					cout<<temp.first<<" "<<temp.second<<endl;
			}

			6 3
			5 8
			4 9

		3.map的成员是pair结构
		4.查找map中是否有某个值:
			m.count(x)==0 说明没有
			m.find(x)==m.end() 说明没有
			

7.set

	unordered_set比set的效率更高,unordered_map比map的效率更高。

	set   集合 不允许有重复元素,树状结构,有序   unorder_set  hash结构,但是快
	set<int>s;
	s.insert(3);
	s.insert(4);
	s.insert(4);
	s.insert(4);
	s.size()   2
	for(auto temp:s)
		cout<<temp<<endl;
	for(auto it=s.begin();it!=s.end();it++)
		cout<<*it<<endl
判断某个数字是否出现在set中:
set.find(x)==set.end()  说明set中没有数字x

	集合中有两个元素,分别是34
其他方法:
	begin()         返回set容器的第一个元素
	end()       返回set容器的最后一个元素
 	clear()          删除set容器中的所有的元素
	empty()     判断set容器是否为空
	max_size()     返回set容器可能包含的元素最大个数
	size()      返回当前set容器中的元素个数
	rbegin     返回的值和end()相同
	rend()     返回的值和rbegin()相同
	find()  				 返回给定值值得定位器,如果没找到则返回end()
	erase(iterator)  		删除定位器iterator指向的值
	erase(first,second)	删除定位器first和second之间的值
	erase(key_value)	删除键值key_value的值
	insert(first,second)  将定位器first到second之间的元素插入到set中,返回值是void.
	insert(key_value)		将key_value插入到set中 ,返回值是pair<set<int>::iterator,bool>bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。
	lower_bound(key_value) 	返回第一个大于等于key_value的定位器
	upper_bound(key_value)	返回最后一个大于等于key_value的定位器

unordered_set
	.count(element):如果元素存在于容器中,则此函数返回1,否则返回0

8.dequeue

	deque 双端队列
	deque<int>d;
	d.push_back(1);
	d.push_back(2);
	d.push_front(9);
	d.push_front(4);

	for(auto temp:d)
		cout<<temp<<" ";

		4 9 1 2
	d.pop_back();
	d.pop_front();

	sort(d.begin(),d.end(),greater<int>);  可以排序,从小到大排序

9.list

	list
	list<int>li;
	li.push_back(6);
	li.push_front(5);
	li.emplace_front(9);
	li.emplace_back(10);
	li.insert(++li.begin(),2);  插入位置用指针表示

//C语言中文网
//http://www.cplusplus.com/reference/stl/
//http://c.biancheng.net/stl/map/

化简分数:

哈希表(散列表)

cin.ignore(); 可以用来消除回车字符的影响

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值