总结:c++几种容器的用法及栈和队列(适合自学c++的同学)

1.string类型用法

还可以比较大小如a>b,如果a的字典序大于b的返回1,否则返回0

getline(cin,s);读取一行string类型
string s2(s1)将s2初始化为s1的副本
或m="123";m+="456";cout<<m输出123465。
cin>>s;
cin遇到空格就停止!!!
string(string &s)
{
    string ans=s;(一等公民,可直接赋值)
    >....;
    return ans;//可以返回string,不和数组一样,即使返回了也不能接收
清空用.clear()//清空状态;.str("");//清空内容 int型转为string型
}
a.length()或a.size()
a.empty()空则返回1

关系操作可进行大小比较


字串操作s.substr(pos,n)它包含从下标pos开始的n个字符,在LCG中常用
s.find(n)在s中查找n的第一次出现
s.rfind(n)在s中查找n的最后一次出现!!!

#include "iostream"
#include "map"

using namespace std;
map<char,string> mp;

int main(){
	string s;
	cin>>s;
	string n=s.substr(2,10);
	int a=s.find("gds");
	int b=s.rfind("adsds");
	cout<<n<<endl<<a<<endl<<b;
	return 0;
} 

//对于使用find函数判断子序列,就不需要使用KMP或字符串匹配算法
//find返回索引,没找到返回零
//对于substr,第一个参数是索引,第二个是返回字符长度
//对于超过了的长度,substr默认返回最大的长度


string m("123465");
 int n=m.find('6');
 cout<<n;输出4
可惜不支持count操作

//在c++中,string直接的赋值是完全没问题的。可以进行完全覆盖!!!如下
string str;
void change(int pos)
{
    str.clear();
    string temp = s.substr(pos);
    str += temp;
    temp = s.substr(0,pos);
    str += temp;
}
#include "iostream"
#include "string"
using namespace std;
int main()
{
	string m;
	cin>>m;
	cout<<m<<endl;
	cin>>m;
	cout<<m<<endl;
	return 0;
}

如上,string反复输入,是没有问题的!!! 

类似java中数组的用法,属于引用

输入123,输出123,在输入456,输出456;

 

int main(){
	
	string str;
	cin>>str;
	reverse(str.begin(),str.end());
	cout<<str;
	return 0;
}
//字符串逆置函数

 

2.vector用法及注意

v.insert(p,t)在迭代器p所指向元素前面插入值为t的新元素,返回指向新添加元素的迭代器
初始化:vector<int>v1(n),v1是含有值初始化的n个副本
vector<int>v2(v1),v2是v1的副本
可以v2=v1,即使两者都赋值
vector对象的操作
vector <int>a;
a.size();
a.clear()清空
resize(n)改变大小
如果n<a.size(),则删除多出来的元素否则采用值初始化的新元素
a.erase(p)删除迭代器所指向的元素,返回被删除元素后面一个的元素的迭代器
a1==a2返回true
输入push_back()和pop_back()在尾部添加和删除元素,用empty()测试是否为空
vector<int>v1,v2;
    v1.push_back(3);
    v2.push_back(4);
    v2.push_back(5);
    v2=v1;
    cout<<v2[0];
    cout<<v2[1];
输出35!!!
不可进行加法操作
输出1.迭代器 2.下标法

3.set用法及注意

每个元素最多出现一次,并在内部会进行排序
输入:set<int> s
s.insert(item);
注意可以重复
输出只能使用迭代器
.count()返回数量
.find(k)如果容器中存在按k索引的元素,则返回指向该元素的迭代器,如果不存在返回超出末端迭代器
.erase(k)删除容器中键为k的元素

4.map用法及注意

也是可以clear的.

map<char,char>或map<char,int>

如果开始没有对应的键值,默认返回0!!!!!!!!!

count()返回数量
.find(k)如果容器中存在按k索引的元素,则返回指向该元素的迭代器,如果不存在返回超出末端迭代器
.erase(k)删除容器中键为k的元素
注意可以重复如:m["123"]=2,m["123"]=4没毛病 如:cout<<m["456"]也不报错默认为0

5.STL中几种函数用法

int a[],sort(a,a+n);或vector <int>a,sort(a.begin(),a.end())头文件为algorithm
lower_bound的作用查找“大于或者等于x的第一个位置lower_bound(a,a+n,x)返回地址,用下标减去a”
string s;
stringstream ss(s);就是把s全部赋值到ss这个流里面
while(ss>>buf)dict.insert(buf)遇到空格截取一段放进set里

6.栈的几种用法stack

s.empty()
s.size()
s.pop()删除栈顶的元素
s.top()返回栈顶的值,不删除元素
s.push(item)在栈顶压入新元素(后进先出)
    队列和优先级队列
queue(先进先出)
priority定义priority_queue<int vector <int>,greater<int> > 头文件queue
q.empty()
q.size()
q.pop()删除队首的值
q.front()返回队首的值只使用于队列
q.back()返回队尾的值只使用于队列
q.top()返回具有最高优先级的元素,只使用于优先级队列
q.push(item)在队尾压入新元素,基于优先级则随机应变

7.迭代器用法

for(set<string>::iterator it=dict.begin();it!=dict.begin();it++)
cout<<*it<<"\n";

8.几个实例
Ananagyram
#include <iostream> 
#include <cstring> 
#include <cctype> 
#include <vector> 
#include <map> 
#include <algorithm> 
using namespace std; 
 
map<string,int> cnt; 
vector<string> words; 
 
string repr(const string& s) //把单词标准化,即大写变小写,排序 
{ 
    string ans=s;  //借用第三方变量进行转换,使最终输出时还能保留大写部分。 
    for(int i=0;i<ans.length();i++) ans[i]=tolower(ans[i]); //ps:toupper()是将小写转大写 
    sort(ans.begin(),ans.end()); 
    return ans; 
} 
int main() 
{ 
    int n=0;string s; 
    while(cin>>s) 
    { 
        if(s[0]=='#') break; 
        words.push_back(s); //存入vector 
        string r=repr(s); 
        if(!cnt.count(r)) cnt[r]=0; 
        cnt[r]++; 
    } 
    vector<string> ans; 
    for(int i=0;i<words.size();i++) 
       if(cnt[repr(words[i])]==1) ans.push_back(words[i]); 
    sort(ans.begin(),ans.end()); 
   for(int i=0;i<ans.size();i++) cout<<ans[i]<<endl; 
   return 0; 
} 

 以上是我自己总结的笔记,全都运行过的应该没问题!

 

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页