STL专题
本次学习内容:vector,set,string,map
vector是向量,可以视为不定长数组。set是集合,带自动去重和排序(默认升序排列),string是字符串。map是映射
定义及访问方式:
vector<typename> name;
eg: vector<int>v; vector<vector<int> >v;//这个保留空格避免被当作移位符号。vector<int>v[100];//也可以设置定长的
在访问的时候可以使用下标访问:eg:temp[3],也可使用迭代器访问具体元素,且迭代器可以使用+x的形式
eg:v[1]; vector<int>::iterator it=v.begin(); *it; *(it+3); 注意v.end()返回的是尾+一个单位元素的地址 v[i]=*(v.begin()+i)
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
set<typename> name;
eg:set<int>s; set<vector<int> >s;//理由同 set<int>temp[100];//可以设置定长
只可使用迭代器访问,不可使用下标,it++可以,不可以用it加数字这种。
string name;
eg:string str="abcd";//可直接赋值 可使用下标访问,整体的读写使用cin和cout,或者 str.c_str()转换成char str[],再使用printf("%s",a)输出
string::iterator it=s.begin(); 也可使用直接下标访问。可以使用str.begin()+x,迭代器操作和vector同,str1+str2可以拼接,同时支持大小号比较(返回结果符合字典序)
str.length()=str.size()
map<typename1,typename2>temp;自动按照key升序排序。可使用key访问eg:m['c'],是一一对应的,不可以一对多
注意typename可以是STL可以是其他类型,但是不可以是数组(string可数组不可),迭代器的it++是ok的,it->first是key,it->second是值。
insert:
it表示需要写迭代器,pos表示填写下标,temp代表元素值
vector的:v.insert(it,temp),在迭代器it的位置插入temp,本位数据向后延,不删除。
set的:s.insert(temp),在集合中插入temp,里面的数据自动排序不需要指定位置
string的:str.insert(pos,x),在下标pos插入字符串x,或者s.insert(it1,it2,it3)在迭代器it的位置,将迭代器[it2,it3)对应位置的字符串插入。
相同的:
v.clear()清除全部元素
v.size()求元素个数,string多了一个s.length()
erase:
vector:v.erase(it)去除迭代器处元素,v.erase(first,last),去除迭代器[first,last)范围内的元素
set:v.erase(it)去除迭代器处元素,多与find结合 v.erase(find(x)),v.erase(x)直接去除某元素(erase复杂度1,findlogn,合起来还是logn),v.erase(first,last)同上
string:s.erase(it),s.erase(first,last)同上,多了一个s.erase(pos,length),去除从pos开始的length长度的元素。
map:m.erase(it),m.erase(first,last)同上,多一个m.erase(key),删除key对应的map数据
find:
vector没有
set:find(x)返回对应x的迭代器
string:find(str),寻找子串第一次出现的位置,find(str,pos)从pos开始到结束的str第一次出现的位置,结果是下标。
map:find(key),返回的是key对应的迭代器
独有的:
vector:v.push_back(x) ,尾部插入元素x,v.pop_back(),尾部删除最后一个元素。
string:s.replace(pos,len,str)从pos下标开始长度为len的串,替换成str s.substr(pos,len)返回字符串,从pos下标开始,字符串长度为len
只有string可以直接拼接,可以使用大于小于比较。别的stl里面迭代器不可以。