vector:长度根据需要而自动改变的数组。
定义:
vectorname; vector Arrayname[arraySize];
如果typename也是一个STL容器,定义时需要记得在>>符号之间加上空格。
如:vector
vector vi;
直接通过vi[index]访问。
通过迭代器访问实例:
#include#include using namespace std; int main(){ vector vi; for (int i = 1; i <= 5;++i) vi.push_back(i); //vi.begin()为取vi的首元素地址,而it指向这个地址 //vi.end()是尾元素地址的下一个地址 vector ::iterator it = vi.begin(); //方式一:vi[i]与*(vi.begin()+i)等价 for (int i = 0; i < 5;i++) cout << *(it + i); cout << endl; //方式二 for (vector ::iterator it = vi.begin(); it != vi.end();it++) cout << *it; return 0; }
输出结果:12345
vector常用函数 push_back()push_back(x)就是在vector后面添加一个元素x,时间复杂度O(n)。
#include#include using namespace std; int main(){ vector vi; for (int i = 1; i <= 3;++i) vi.push_back(i);//将1、2、3依次插入vi末尾 for (int i = 0; i < vi.size();++i)//size()函数给出vi元素个数 cout << vi[i]; return 0; }
输出结果:123
pop_back()删除vector的尾元素,时间复杂度为O(1)。
#include#include using namespace std; int main(){ vector vi; for (int i = 1; i <= 3;++i) vi.push_back(i); //将1、2、3依次插入vi末尾 vi.pop_back(); //删除vi的尾元素3 for (int i = 0; i < vi.size();++i)//size()函数给出vi元素个数 cout << vi[i]; return 0; }
输出结果:12
size()用来获取vector中元素个数,时间复杂度O(1)。
#include#include using namespace std; int main(){ vector vi; for (int i = 1; i <= 3;++i) vi.push_back(i); //将1、2、3依次插入vi末尾 cout << vi.size(); return 0; }
输出结果:3
clear()清空vector中所有元素,时间复杂度O(N),其中N为vector中元素的个数。
#include#include using namespace std; int main(){ vector vi; for (int i = 1; i <= 3;++i) vi.push_back(i); //将1、2、3依次插入vi末尾 vi.clear(); cout << vi.size(); return 0; }
输出结果:0
insert()insert(it,x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度O(N)。
#include#include using namespace std; int main(){ vector vi; for (int i = 1; i <= 5;++i) vi.push_back(i); //将1、2、3、4、5依次插入vi末尾 for (int i = 0; i < vi.size();++i) cout << vi[i]; cout << endl; vi.insert(vi.begin() + 2, 0);//将0插入vi[2]的位置 for (int i = 0; i < vi.size();++i) cout << vi[i]; return 0; }
输出结果:
12345 120345erase() 删除单个元素
erase(it):删除迭代器为it处的元素。
#include#include using namespace std; int main(){ vector vi; for (int i = 1; i <= 5;++i) vi.push_back(i); //将1、2、3、4、5依次插入vi末尾 for (int i = 0; i < vi.size();++i) cout << vi[i]; cout << endl; vi.erase(vi.begin() + 3);//删除vi[3]即删除4 for (int i = 0; i < vi.size();++i) cout << vi[i]; return 0; }
输出结果:
12345 1235删除一个区间内所有元素
erase(first,last):删除[first,last)内所有元素。
#include#include using namespace std; int main(){ vector vi; for (int i = 1; i <= 5;++i) vi.push_back(i); //将1、2、3、4、5依次插入vi末尾 for (int i = 0; i < vi.size();++i) cout << vi[i]; cout << endl; vi.erase(vi.begin()+1,vi.begin()+4);//删除vi[1]、vi[2]、vi[3] for (int i = 0; i < vi.size();++i) cout << vi[i]; return 0; }
输出结果:
12345 15set Introduction
set:集合,是一个内部自动有序且不含重复元素的容器。
定义:
setset容器内元素的访问name; set Arrayname[arraySize];
set只能通过迭代器iterator访问。
set::iterator it;
只有vector和string支持(it+i)的访问方式。*
实例:
#include#include using namespace std; int main(){ set st; st.insert(5); st.insert(2); st.insert(4); st.insert(1); st.insert(3); //set不支持it ::iterator it = st.begin(); it != st.end();it++) cout << *it; return 0; }
输出结果:12345
set常用函数 insert()insert(x)将x插入set容器中,并自动递增排序和去重,时间复杂度O(logN),其中N为set内的元素个数。实例如上“set容器内元素的访问”。
find()find(value)返回set中对应值为value的迭代器,时间复杂度O(logN),N为set中元素个数。
#includesize()#include using namespace std; int main(){ set st; for (int i = 1; i <= 3;++i) st.insert(i); set ::iterator it = st.find(2);//在set中查找2,返回其迭代器 cout << *it; //也可以写成cout<<*(st.find(2)); return 0; }
size()用来获得set内元素的个数,时间复杂度为O(1)。
#include#include using namespace std; int main(){ set st; st.insert(2);//插入2 5 4 st.insert(5); st.insert(4); cout << st.size(); return 0; }
输出结果:3
clear()clear()清空set中的所有元素,时间复杂度O(N),N为set内元素个数。
#include#include using namespace std; int main(){ set st; st.insert(2);//插入2 5 4 st.insert(5); st.insert(4); st.clear(); cout << st.size(); return 0; }
输出结果:0
erase() 删除单个元素st.erase(it),it为所需要删除元素的迭代器。时间复杂度O(1),可以结合find()函数使用。
#include#include using namespace std; int main(){ set st; for (int i = 1; i <=5;++i) st.insert(i); st.erase(st.find(3));//利用find()函数找到3,然后用erase删除它 for (set ::iterator it = st.begin(); it != st.end();it++) cout << *it; return 0; }
输出结果:1245
删除一个区间里所有元素st.erase(first,last):删除一个区间里所有元素,其中first为所需要删除区间的其实迭代器,last为所需要删除区间的末尾迭代器的下一个地址,即删除[first,last)。时间复杂度O(last-first)。
#include#include using namespace std; int main(){ set st; for (int i = 1; i <=5;++i) st.insert(i); st.erase(st.find(3), st.end());//删除元素3到末尾之间的元素,即删除3~5。 for (set ::iterator it = st.begin(); it != st.end();it++) cout << *it; return 0; }
输出结果:12
string Introduction定义方式与基本数据类型相同,只需要在string后面跟上变量名。
string str; string str="abcd";//给变量复制初始化string中内容的访问 通过下表访问
#include#include using namespace std; int main(){ string str = "abcd"; for (int i = 0; i < str.length();i++) cout << str[i]; return 0; }
输出结果:abcd
通过迭代器访问string不像其他STL容器那样需要参数,可以直接定义:
string::iterator it;
实例:
#include#include using namespace std; int main(){ string str = "abcd"; for (string::iterator it = str.begin(); it != str.end();it++) cout << *it; return 0; }
输出结果:abcd
string常用函数 operator+=string加法:可以将两个string直接拼接起来。
#include#include using namespace std; int main(){ string str1 = "abc", str2 = "xyz", str3; str3 = str1 + str2;//str1与str2拼接,赋值给str3 str1 += str2;//将str2直接拼接到str1上 cout << str1 << endl; cout << str2 << endl; cout << str3 << endl; return 0; }
输出结果:
abcxyz xyz abcxyzcompare operator
两个string类型可以直接使用==,!=,<, <=, >, >=比较大小,比较规则是字典序。
#include#include using namespace std; int main(){ string str1 = "aa", str2 = "aaa", str3="abc",str4="xyz"; if(str1 =str3) cout << "str4>=str3" << endl; return 0; }
输出结果:
str1length()和size()=str3
leng()返回string的长度,即存放的字符数,时间复杂度O(1)。
string str="abc"; cout<输出结果:3 3
insert()clear()
insert(pos,string):在pos号位置插入字符串string。
insert(it,it2,it3),it为原字符串欲插入位置,it2和it3为待插字符串的首位迭代器,用来表示串[it2,it3)将被插在it的位置上。
#include#include using namespace std; int main(){ string str = "abcxyz", str2 = "opq";//str是原字符串,str2是待插字符串 //方式一:往str[3]处插入opq // str.insert(3, str2); //方式二: str.insert(str.begin() + 3, str2.begin(), str2.end()); cout << str << endl; return 0; } 输出结果:abcopqxyz
clear()清空string中的数据,时间复杂度O(1)。
#include#include using namespace std; int main(){ string str = "abcd"; str.clear(); cout << str.length(); return 0; } 输出结果:0
erase()有删除单个元素、删除一个区间里所有元素两种方式。时间复杂度均为O(N)。
删除单个元素#include#include using namespace std; int main(){ string str = "abcdefg"; str.erase(str.begin() + 4);//删除4号位(e) cout << str; return 0; } 输出结果:abcdfg
删除一个区间内所有元素
- str.erase(first,last):删除[first,last).
#include#include using namespace std; int main(){ string str = "abcdefg"; //删除在[str.begin()+2,str.end()]内的元素,即cdefg str.erase(str.begin() + 2, str.end()); cout << str; return 0; } 输出结果:ab
- str.erase(pos,length),其中pos为需要开始删除的其实位置,length为删除的串长度。
#include#include using namespace std; int main(){ string str = "abcdefg"; //删除从3号位开始的2个字符,即de str.erase(3, 2); cout << str; return 0; } 输出结果:abcfg
substr()substr(pos,len):返回从pos号位开始、长度为len的子串。时间复杂度O(len)。
#include#include using namespace std; int main(){ string str = "abcdefg"; cout << str.substr(0,3); return 0; } 输出结果:abc
string::nposstring::npos是一个常数,本身值为-1,npos用来表示不存在的位置。
#include#include using namespace std; int main(){ if(string::npos==-1) cout << "-1 is true"< 输出结果:
-1 is true 18446744073709551615 is also truefind()str.find(str2),当str2是str的子串时,返回其在str中第一次出现的位置;如果str2不是str的子串,那么返回string::pos。
str.find(str2,pos):从str的pos号位开始匹配str2,返回值与上相同。
时间复杂度O(mn),n,m分别为str和str2的长度。
#include#include using namespace std; int main(){ string str = "Thank you"; string str2 = "you"; string str3 = "like"; cout << str.find(str2) << endl; cout << str.find(str3) << endl; return 0; } 输出结果:
6 18446744073709551615replace()str.replace(pos,len,str2):把str从pos号位开始、长度为len的子串替换为str2。
str.replace(it1,it2,str2):把str的迭代器[it1,it2)范围的子串替换为str2。
时间复杂度O(str.length())
#include#include using namespace std; int main(){ string str = "Thank you for your love"; string str2 = "her"; string str3 = "enthusiasm"; cout << str.replace(14, 4, str2) << endl; cout << str.replace(str.end()-4, str.end(), str3); return 0; } 输出结果:
Thank you for her love Thank you for her enthusiasm



