C++ STL中最基本以及最常用的類或容器
string、vector、set、list、map
string
處理string中的字符
for(int i=0;i<s3.size();i++)
{
cout<<s3[i]<<endl;
s3[i]='s';
}
迭代器iterator,訪問容器元素
iter
返回迭代器iter所指元素的引用
iter->mem
解引用iter并獲取該元素的名問men的成員,等價于(item).mem
++iter
令iter指示容器中的下一個元素
--iter
令iter指示容器中的上一個元素
iter1==iter2;iter1!=iter2
判斷兩個迭代器是否相等(不相等),如果兩個迭代器指示的是同一個元素或者它們是同一個容器的尾后迭代器,則相等;反之,不相等
string str("hi sysu");
for (string::iterator it = str.begin(); it != str.end(); it++)
{
cout << *it << endl;
}
string 別的函數(shù)
string sq("heoolo sdaa ss");
cout << s.find("aa", 0) << endl; //返回的是子串位置。第二個參數(shù)是查找的起始位置,如果找不到,就返回string::npos
if (s.find("aa1", 0) == string::npos)
{
cout << "找不到該子串!" << endl;
}
vector
如果vector的元素類型是int,默認(rèn)初始化為0;如果vector的元素類型為string,則默認(rèn)初始化為空字符串。
使用push_back加入元素,并且這個元素是被加在數(shù)組尾部。
for (int i = 0; i < 20; i++)
{
v1.push_back(i);
}
vector其他的操作
v.empty()
v.size()
v.push_back(t)
v[n],返回v中第n個位置上的元素的引用
v1={a,b,c...}
訪問和操作vector中的每個元素
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << endl;
v1[i] = 100;
cout << v1[i] << endl;
}
只能對已存在的元素進(jìn)行賦值或者修改操作,如果要是新加入元素,務(wù)必使用push_back.push_back的作用,告訴編譯器為新元素開辟空間。將新元素存入新空間里。
使用迭代器來訪問元素
vector<string> v6 = { "hi","my","name","is","lee" };
for (vector<string>::iterator iter = v6.begin(); iter != v6.end(); iter++)
{
cout << *iter << endl;
//下面兩種方法都行
cout << (*iter).empty() << endl;
cout << iter->empty() << endl;
}
List
list就是鏈表,在C語言中我們想使用鏈表都是自己去實現(xiàn)的,實現(xiàn)起來倒不難,但是如果有現(xiàn)成的高效的鏈表可以使用的話,我們就不需要重復(fù)造輪子了。STL就提供了list容器給我們。
list是一個雙向鏈表,而單鏈表對應(yīng)的容器則是foward_list。
list即雙向鏈表的優(yōu)點是插入和刪除元素都比較快捷,缺點是不能隨機訪問元素。
初始化方式就大同小異了,跟vector基本一樣。要想用list先加個頭文件list。
#include <list>
#include <iostream>
#include <list>
#include <string>
using namespace std;
template <typename T>
void showlist(list<T> v)
{
for (list<T>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it;
}
cout << endl;
}
int main()
{
list<int> l1{ 1,2,3,4,5,5,6,7,7 };
showlist(l1);
list<double> l2;
list<char> l3(10);
list<int> l4(5, 10); //將元素都初始化為10
showlist(l4);
system("pause");
return 0;
}
map
map運用了哈希表地址映射的思想,也就是key-value的思想,來實現(xiàn)的。
首先給出map最好用也最最常用的用法例子,就是用字符串作為key去查詢操作對應(yīng)的value。
要使用map得先加個頭文件map。
#include <map>
#include <iostream>
#include <map>
#include <string>
using namespace std;
void showmap(map<string, int> v)
{
for (map<string, int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << it->first << " " << it->second << endl; //注意用法,不是用*it來訪問了。first表示的是key,second存的是value
}
cout << endl;
}
int main()
{
map<string, int> m1; //<>里的第一個參數(shù)表示key的類型,第二個參數(shù)表示value的類型
m1["Kobe"] = 100;
m1["James"] = 99;
m1["Curry"] = 98;
string s("Jordan");
m1[s] = 90;
cout << m1["Kobe"] << endl;
cout << m1["Jordan"] << endl;
cout << m1["Durant"] << endl; //不存在這個key,就顯示0
m1.erase("Curry");//通過關(guān)鍵字來刪除
showmap(m1);
m1.insert(pair<string, int>("Harris", 89)); //也可以通過insert函數(shù)來實現(xiàn)增加元素
showmap(m1);
m1.clear(); //清空全部
system("pause");
return 0;
}
[圖片上傳中...(image-fb90d6-1554208576435-0)]
如果想看看某個存不存在某個key,可以用count來判斷
if (m1.count("Lee"))
{
cout << "Lee is in m1!" << endl;
}
else
{
cout << "Lee do not exist!" << endl;
}
用迭代器來訪問元素
for (map<string, int>::iterator it = m1.begin(); it != m1.end(); it++)
{
cout << it->first<<" "<<it->second << endl; //注意用法,不是用*it來訪問了。first表示的是key,second存的是value
}