
## 今天学了什么今天学习C中的STL-string容器的成员接口。## STL①STLstandard template library标准模板库提高代码复用性。②从广义上分为容器container、算法algorithm、迭代器iterator其中容器和算法通过迭代器进行连接还包括仿函数、适配器配接器、空间配置器。③容器常用的数据结构数组、链表、树、栈、队列、集合、映射表等分类分为序列式容器和关联式容器序列式容器强调值的排序每个元素有固定的位置关联式容器二叉树结构各元素中间没有严格的物理位置顺序④算法分类分为质变算法和非质变算法质变算法运算过程中会更改区间内的元素内容如拷贝、替换、删除等非质变算法运算过程中不会更改区间内的元素内容如查找、计数、遍历等⑤迭代器算法通过迭代器才能访问容器中的元素每个容器都有自己专属的迭代器⑥例vector容器存放数据Ⅰ.内置数据类型容器vector算法for_each迭代器vectorint::iterator#includeiostream using namespace std; #includevector #includealgorithm void printarr(int val) { cout val ; } void test() { vectorint v; for (int i 0; i 5; i) { v.push_back(i); } vectorint::iterator it v.begin(); //利用while循环打印 while (it! v.end()) { cout *it ; it; } cout endl; //利用for循环打印 for (vectorint::iterator it v.begin(); it v.end(); it) { cout (*it) ; } coutendl; //利用for_each打印 for_each(v.begin(), v.end(), printarr); } int main() { test(); return 0; }Ⅱ.自定义类型#includeiostream using namespace std; #includevector #includestring #includealgorithm //自定义person类 class Person { public: Person(string name, int age) { m_name name; m_age age; } string m_name; int m_age; }; // 运算符重载 ostream operator(ostream out, const Person p) { out 姓名 p.m_name 年龄 p.m_age; return out; } //打印函数 void Myprint(Person p) { cout 姓名 p.m_name 年龄 p.m_age endl; } void test1() { vectorPerson p; Person p1(孙悟空, 1000); Person p2(猪八戒, 500); Person p3(安琪拉, 20); p.push_back(p1); p.push_back(p2); p.push_back(p3); cout while循环方法打印 endl; vectorPerson::iterator itBegin p.begin(); while (itBegin ! p.end()) { cout *itBegin endl; itBegin; } cout endl; cout for循环方法打印 endl; for (vectorPerson::iterator it p.begin(); it p.end(); it) { cout 姓名 (*it).m_name 年龄 (*it).m_age endl; } cout endl; cout for_each方法打印 endl; for_each(p.begin(), p.end(), Myprint); } int main() { test1(); return 0; }Ⅲ.嵌套容器优先用for循环#includeiostream using namespace std; #includevector #includealgorithm void Myprint(int val) { cout val ; } int main() { vectorvectorint v; vectorintv1; vectorintv2; vectorintv3; for (int i 0; i 5; i) { v1.push_back(i); v2.push_back(i 1); v3.push_back(i 2); } v.push_back(v1); v.push_back(v2); v.push_back(v3); for (vectorvectorint::iterator it v.begin(); it v.end(); it) { for (vectorint::iterator vit (*it).begin(); vit (*it).end(); vit) { cout *vit ; } cout endl; } return 0; }### string容器①定义string容器本质上是一个类类内部封装了char*管理这个字符串是一个char*型的容器。②特点string类内部封装了很多成员方法例如查找find、拷贝copy等③string构造函数stringstringconst char* sstringconst string sstringint n,char c④string赋值操作string operatorconst char*sstring operatorconst string sstring operatorchar cstring assignconst char*sstring assignconst char*s,int nstring assignconst string sstring assignint n,char c⑤string字符串拼接string operatorconst char*sstring operatorconst string sstring operatorconst char cstring appendconst char*sstring appendconst char*s,int nstring appendconst string sstring appendconst string sint pos,int n⑥查找替换** 查找find返回找到的字符对应的下标没找到返回string::nposrfind从右往左找返回下标** 替换replace起始位置被替换的个数用于替换的内容str⑦字符串比较compareconst char*scompareconst string s 返回0返回1返回-1注主要用于对比两个字符串是否相同。⑧读取char operator[]int nchar atint n⑨插入删除截取子串插入insert位置str删除erase位置个数截取子串substr位置个数返回截取的子串。如果第二个参数不写默认截取到字符串末尾** 上述成员函数的使用如下 **void test() { //构造函数 string s; string s1(hello); string s2(s1); string s3(3, c); cout s1: s1 s2: s2 s3: s3 endl; //赋值 // operator string s4; s4 world; string s5; s5 s4; string s6; s6 c; cout s4: s4 s5: s5 s6: s6 endl; //assign string s7; s7.assign(this); string s8; s8.assign(is ok,2); string s9; s9.assign(s7); string s10; s10.assign(3, c); cout s7: s7 s8: s8 s9: s9 s10:s10endl; //字符串拼接 //operator string s11; s11 c; string s12; s12 s11; string s13; s13 c; cout s11: s11 s12: s12 s13: s13 endl; //append string s14; s14.append(this); string s15; s15.append( is ok abc,6); string s16; s16.append(s15); string s17; s14 s15; s17 s14; string s18; s18.append(s17, 0, 7); cout s14: s14 s15: s15 s16: s16 s17:s17 s18:s18 endl; //查找 替换 cout 查找 s2中l的位置 s2.find(l) endl; cout rfind 查找 s2中l的位置 s2.rfind(l) endl; s3.replace(1, 1, ); cout s3: s3 endl; //字符串比较 if (s2.compare(s3) 0) { cout s2s3 endl; } else { cout s2!s3 endl; } //字符串读取 cout s1[0]: s1[0] endl; cout s1.at(2): s1.at(2) endl; //插入 删除 s4.insert(1, 666); cout s4 endl; s4.erase(1, 3); cout s4 endl; //截取子串 cout 截取s15子串 s15.substr(4, 2) endl; }