标签:style blog color io os ar for div sp
STL 标准模板库
标准模板库(Standard Template Library,缩写:STL)是一个C++软件库, 包括5个组件,分别是:算法、容器、迭代器,函数和适配器。
一:容器之初始化:
1.直接初始化一个空的容器;
2.用一个容器去初始化另一个容器;
3.指定容器的初始大小;
4.指定容器的初始大小和初始值;
5.用一对迭代器范围去初始化容器。
示例代码如下:
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <fstream> 5 #include <algorithm> 6 using namespace std; 7 8 void print(vector<string> &vec) 9 { 10 for(vector<string>::iterator it = vec.begin(); 11 it != vec.end(); 12 ++it) 13 { 14 cout << *it << endl; 15 } 16 } 17 18 int main(int argc, const char *argv[]) 19 { 20 vector<string> vec ;//num.1 21 vec.push_back("changjiang"); 22 vec.push_back("huanghe"); 23 vec.push_back("dahai"); 24 vec.push_back("beijing"); 25 vec.push_back("shanghai"); 26 vec.push_back("guangdong"); 27 28 vector<string> vec2(vec); //num.2 29 cout<< "num2:" << endl ; 30 print(vec2); 31 32 vector<string> vec4(4, "test");//num.4容器大小和初始值 33 cout << "num.4:" << endl ; 34 print(vec4); 35 36 vector<string>::iterator it1,it2 ; 37 it1 = vec.begin(); 38 it2 = find(vec.begin(), vec.end(), "dahai"); 39 vector<string> vec5(it1, it2);//num.5 changjiang+huanghe 40 cout << "num.5" << endl; 41 print(vec5); 42 43 return 0; 44 }
注意 (第二种与第五种初始化方式的区别):
//采用引用方式。
1):num.2 不仅要求是 容器类型(vector<string>) 而且要求 容器元素类型(string);
//采用值copy方式。
2):num.5 不要求 容器类型相同,对于 容器元素,要求能相互兼容即可
如 vector<int> vec
可以用 list<double>,vector<int>,list<int> 。
另外C++中,指针也可以当做迭代器,示例如下:
1 //指针也可以做迭代器。 2 int main(int argc, const char *argv[]) 3 { 4 const size_t MAX_S = 4 ; 5 string arr[MAX_S] = {"hello", "world", "foobar"}; 6 7 vector<string> vec(arr, arr + MAX_S); 8 9 for(vector<string>::iterator it = vec.begin(); 10 it != vec.end(); 11 ++it) 12 { 13 cout << *it << endl; 14 } 15 return 0; 16 }
二:容器元素的约束类型:
1、容器 元素 必须支持赋值操作;
2、元素类型的 对象 必须可以复制。
示例如下:
1 //将构造函数设为私有成员函数 2 class Stu 3 { 4 //根源 5 private: 6 Stu(const Stu&); 7 Stu &operator = (const Stu&); 8 9 }; 10 11 int main(int argc, const char *argv[]) 12 { 13 vector<Stu> vec(10);//error 14 return 0; 15 }
三:迭代器(前面我们已经用过迭代器的部分操作,今天我们系统探讨):
1):四个特殊的迭代器成员:
c.begin() //指向容器C的第一个元素
C.end() //指向最后一个元素的下一个位置
C.rbegin() //返回一个逆序迭代器,指向容器c的最后一个元素
C.rend() //返回一个逆序迭代器,指向容器c的第一个元素的前面的位置
2):迭代器的基本操作:
*it 、it-> 、 ++it 、 --it iter1 = iter2、iter2 != iter1
首先我们先介绍一个for循环
for(vector<string>::iterator it = vec.begin() ;
it != vec.end();
++it)
{ cout << *it << endl ; }
上面代码的作用是:打印 容器vec 中的元素 至屏幕。
注意上述 for 循环中
vec.begin()是 第一个元素的位置。
vec.end() 是 最后一个元素的下一个位置。
3):迭代器的范围(左闭右开区间)的优点:
a、当 begin 与 end 相等时,迭代器范围为空;
b. 当 begin 与 end不相等时,迭代器范围内至少有一个元素,而且 begin 指向该区间中的第一元素。此外,通过若干次自增运算可以使 begin 的值不断增大,直到 fbegin == end 为止。
增加元素:
示例代码如下:
1 #include <iostream> 2 #include <string> 3 #include <list> 4 #include <vector> 5 #include <algorithm> 6 using namespace std; 7 8 //insert 9 void print(const list<string> &lst) 10 { 11 for(list<string>::const_iterator it = lst.begin(); 12 it != lst.end(); 13 ++it) 14 { 15 cout << *it << " "; 16 } 17 cout << endl ; 18 } 19 20 int main(int argc, const char *argv[]) 21 { 22 list<string> lst ; 23 lst.push_back("shanghai");//back 24 lst.push_front("shenzhen");//front 25 //inset one 26 cout <<"first" << endl; 27 print(lst); 28 29 lst.insert(lst.begin(), "huaibei"); 30 print(lst); 31 32 lst.insert(lst.end(), "anhui"); 33 print(lst); 34 35 list<string>::iterator it = find(lst.begin(), lst.end(), "shanghai"); 36 lst.insert(it, "fenghua"); 37 print(lst); 38 39 //insert nums 40 cout << "last" << endl; 41 lst.insert(it, 3, "beijing"); 42 print(lst); 43 44 lst.insert(lst.end(), lst.begin(), lst.end()); 45 print(lst); 46 return 0; 47 }
迭代器失效问题:
任何 insert 或者 push 操作都可能到时迭代器失效。当循环将元素插入到 vector或者list中,
程序必须确保在每次循环后都得到更新。
删除与查询 操作与insert 操作类似,不再赘述。
常用: lst.pop_back() 、lst.pop_frong() 、 lst.earse(it)(需要判断是否要返回下标)。
lst.erase( first, last)。lst.erase(lst.begin(), lst.end());
容器的容量问题:
代码如下:
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <fstream> 5 using namespace std; 6 7 void print(const vector<int> &vec) 8 { 9 for(vector<int>::const_iterator it = vec.begin(); 10 it != vec.end(); 11 ++it) 12 { 13 cout << *it << " "; 14 } 15 cout << endl; 16 } 17 //resize相当于加人,减人。capacity没有变化(改变时2的倍数) 18 int main(int argc, const char *argv[]) 19 { 20 vector<int> vec ; 21 vec.push_back(12); 22 23 cout << vec.size() << endl ; 24 cout << vec.empty() << endl ; 25 26 vec.resize(5);//加上4个数 27 cout << vec.size() << endl ; 28 print(vec); 29 30 vec.push_back(12); 31 vec.push_back(12); 32 vec.push_back(12); 33 vec.push_back(12); 34 vec.push_back(12); 35 36 vec.resize(7);//减去三个数 37 print(vec); 38 39 vec.reserve(20);//重置capacity 40 cout << vec.size()<< endl; 41 cout << vec.capacity() << endl ; 42 43 return 0; 44 }
简述:
1):Vector和list的区别
Vector内部 采用顺序表实现,而list采用链表实现,所以二者的差别很大程度是顺序表和链表的差别。
2):截取字串substr;
3):Append:在string后面串接新的字符串;
4):Replace:字符插入到某些位置,并替换已经存在的字符;
标签:style blog color io os ar for div sp
原文地址:http://www.cnblogs.com/xfxu/p/3987300.html