1. 程式人生 > >總結:c++幾種容器的用法及棧和佇列(適合自學c++的同學)

總結: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; 
} 

 以上是我自己總結的筆記,全都執行過的應該沒問題!