1.vector 定义:vector<typename> name;
typename 表示可以是任何基本类型,int, doubel, char, 结构体,也可以是STL标准容器,例如vector, set, queue 等。
例如:vector<vector<int> > name;相当于一个二维数组只不过这个是变长的。
2.vector 容器内元素的访问;一般有两种形式@1:下标访问,@2:通过迭代器访问。
迭代器(iterator)可以理解为一种类似指针的东西,定义:vector<typename>::iterator it;可以通过*it来访问vector里面的元素。
int main(){
ios::sync_with_stdio(false);
vector<int>v;
for(int i = 1; i <= 5; i++){
v.push_back(i);
}
vector<int>::iterator it = v.begin();
for(int i = 0; i < 5; i++){
printf("%d ",*(it + i));
}
printf("\n");
for(int i = 0; i < 5; i++){
printf("%d ",v[i]);
}
printf("\n");
for(vector<int>::iterator it = v.begin(); it != v.end(); it++){
printf("%d ", *it);
}
return 0;
}
在常用STL容器中,只有在vector和string中,才允许使用v.begin() + 3这种迭代器加上整数的写法。
int main(){
ios::sync_with_stdio(false);
vector<int>v;
for(int i = 1; i <= 5; i++){
v.push_back(i);
}
v.insert(v.begin() + 2, -1); //用来向vector的任意迭代器it插入一个元素x,时间复杂度o(n)
//v.pop_back();//pop_back()用来删除vector尾元素。size()获得vector中元素个数
//erase()有两种用法,删除单元格,删除一个区间[)的所有元素,时间复杂度为o(n)
//v.erase(v.begin() + 3);
//for(int i = 0;i < v.size(); i ++){
// printf("%d ",v[i]);
//}
v.erase(v.begin()+1,v.begin()+2);
for(int i = 0;i < v.size(); i ++){
printf("%d ",v[i]);
}
printf("\n");
//v.clear();//清空vector中所有元素
//printf("%d\n",v.size());
return 0;
}
set的常见用法:
set的定义:set<typename> name;定义贺vector的一样。大部分stl都是这样定义的。
set元素的访问;由于除开vector和string之外的stl容器都不支持*(it+i)的访问形式。
int main(){
set<int>s;
s.insert(3);//insert(x)将x插入set容器中,并且自动排序和去重时间复杂度o(logn)
s.insert(5);
s.insert(2);
s.insert(3);
s.insert(6);
s.insert(7);
for(set<int> :: iterator it = s.begin(); it != s.end(); it++){
printf("%d ",*it);
}
printf("\n");
//find()函数返回set中对应为value的迭代器,时间复杂度为olog(n)
printf("%d\n",*(s.find(5)));
//erase()函数有两种用法:删除单个元素,删除一个区间内的所有元素;
//删除单个元素有两种方法删除迭代器,或者直接删除value.
//s.erase(s.find(2));
//s.erase(2);
//区间删除[);
//size()返回set内元素的个数。时间复杂度o(1)
printf("%d\n",s.size());
s.erase(s.find(3),s.end());
for(set<int> :: iterator it = s.begin(); it != s.end(); it++){
printf("%d ",*it);
}
printf("\n");
//clear()清空set的所有元素时间复杂度o(n)
s.clear();
printf("%d\n",s.size());
return 0;
}
使用find函数要判断元素是否存在只是要使用迭代器:
set<int>s;
for(int i = 1; i <= 5; i++)s.insert(i);
set<int>::iterator iter;
iter = s.find(5);
if(iter!=s.end()){
cout << *(s.find(5)) << endl;
}else{
cout << "no thanks" << endl;
}
set中元素是唯一的,如果需要处理不唯一的情况,则可以使用multiset。另外还增加了unordered_set,以散列表代替set内部的红黑数。可以用来处理只去重不排序的需求,速度比set快的多。
string的常见用法:
string的定义:string str;
int main(){
string str, str2, str3;
//如果要读入和输出整个字符串,则只能用cin和cout;
//可以使用c_str()来用printf()输出字符串,把字符串转化为字符数组;
//cin >> str;
//printf("%s\n",str.c_str());
//string可以使用+法可以直接比较大小。
//length()//size()返回字符串的长度
//insert()时间复杂度o(n)
//insert(pos, string);在Pos号位置插入字符串string
//insert(it, it2, it3); it为原字符串,it2,it3为待插字符串的首尾迭代器用来表示[it2, it3)将被插入在it位置上
//cin >> str2 ;
//str3 = str2 + str;
//cout << str3 << endl;
//str3.insert(3,str2);
//cout << str3 << endl;
//cout << str3.length() << " " << str3.size() << endl;
//str = "wefgy";
//str2 = "fguy";
//erase()函数删除单个元素,删除一个区间内的所有元素。时间复杂度均为o(n).
//cin >> str >> str2;
//str2.insert(str2.begin()+3,str.begin(),str.end());
//cout << str2 << endl;
cin >> str;
//str.erase(str.begin()+2);
//cout << str << endl;
//删除一个区间内的所有元素[first, last)
//str.erase(str.begin()+2, str.end()-1);//迭代器法
str.erase(3,2);//删除从第三个元素开始的两个字符;
//clear()函数用以清空string中的数据,时间复杂度o(1)
str.clear();
//substr()函数substr(pos,len)返回从POS位置开始,长度为len的子串时间复杂度为o(len)
//cout << str.length() << endl;
//cout << str << endl;
str2 = "Thank you for your smile";
cout << str2.substr(0,5) << endl;
return 0;
}
在这里主要说明find()函数和string::npos的使用;
int main(){
//string str = "Thank you for your smile";
//string str2 = "you";
//string str3 = "me";
//string::npos
//string::npos是一个常数,其本身的值为-1,但是由于是unsigned_int类型,因此实际上也可以认为是unsigned_int类型的最大值。
//string::npos用以作为find函数失配时的返回值。主要结合find()函数来使用;
//find(str2)函数返回其在str中第一次出现的位置如果不存在str2返回string::npos;
//find(str2, pos)从str的pos号位开始匹配str2,返回值与上相同
//if(str.find(str2) != string::npos){
// cout << str.find(str2) << endl;
//}
//if(str.find(str2,7) != string::npos){
// cout << str.find(str2, 7) << endl;
//}
//replace()
//replace(pos,len,str2)把str从pos位置开始。长度为len的子串替换为str2.
//replace(it1,it2,str2)把str的迭代器[it1,it2)范围的子串替换为str2;时间复杂度为o(str.length())
string str = "Maybe you will turn around";
string str2= "will not";
string str3 = "surely";
cout << str.replace(10, 4, str2) << endl;
cout << str.replace(str.begin(),str.begin()+5,str3) << endl;
return 0;
}