C++: C语言+类+模板
STL的6大组件:容器,迭代器,算法 适配器,分配器,仿函数
容器包含:顺序容器,关联容器
首先顺序容器中包含string容器,数组容器(vector,array,hash_map),链表容器(list,forward_list),双端队列(deque);
其次,关联容器包含set,map,multiset,multimap等
怎么学STL?从定义,属性,输出,修改,操作函数,运算符重载6个方面出发
一. 定义一个string的迭代器
下面介绍string容器中的迭代器:
string::iterator ite;
二. 怎么去理解string容器的迭代器
就相当于定义了一个指向string对象元素的指针,本质相当于char* 指针,当然char*指针只能够指向char型字符的地址,而string迭代器可以指向任意类型字符的地址,比如int,char,float等等。
定义完了,就跟指针的用法一样了。
三. string容器的迭代器失效的问题
string重新申请空间的时候,迭代器会失效的。
在VS2005版本中,string容器的容量计算大小是15+16*n,即至少申请15个容量。
情况一:假设我们原本string容器已经存了7个字符,现在通过添加5个字符.因为原来15个空间还没存满,这5个字符会在7个字符的尾部添加;迭代器依然指向string容器首地址,因此迭代器不会失效。
sting str('abcdefg');
str::iterator ite;
ite=str.begin();
str.append(5,'a');
for (size_t i = 0; i < str.size(); i++) //size_t代表无符号整形
{
{
cout << *ite << " ";
ite++;
}
ite++;
}
情况二:
如果我们将上面str.append(5,'a');改成str.append(18,'a');那么迭代器会失效
因为此时15个空间已经不够用了,string重新申请新的空间,此时迭代器已经失效了。
四.string成员函数涉及到的迭代器
iterator begin();函数返回一个迭代器,指向字符串的第一个元素;
iterator end(); 函数返回一个迭代器,指向字符串某尾元素
append(input_iterator start,input_iterator end);
例子:string str("abc");
string str1("efg");
str.append(str1.begin(),str.end());
cout<<str; //这样输出abcefg
iterator erase(iterator pos);
例子: string str("abcdefgh");
str.earse(str.begin());
cout<<str; //输出bcdefgh
iterator insert(iterator i, size_type num, const char &ch);
例子: string str("abcdefgh")
str.insert(str.begin()+2,3,'N')
cout<<str;//输出abNNNcdefgh
五.string容器涉及的算法
#include<algorithm>
涉及算法1:遍历算法 for_each();
例子:
string str("abcdef");
for_each(str.begin(),str.end(),fun())
//其中第三个fun()函数自己定义,就是对遍历函数看要怎么操作,fun()参数 类型跟str中类型一致
涉及算法2:排序算法 sort();
string str("baecdfg");
sort(str.begin(),str.end());
cout<<str;//输出abcdefg,注意默认从小到大排序
sort(str.begin(),str.end(),greater<char>());//输出gfedcba,从大到小排列