總結: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的最後一次出現!!!
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反覆輸入,是沒有問題的!!!
輸入123,輸出123,在輸入456,輸出456;
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的.
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;
}