STL 提供了一组表示 容器 迭代器 函数对象和算法的模板
1、容器 - vertor
vector 是一个与数组类似的单元,示例,vector访问形式如同数组
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int const NUM = 5;
int main() {
//类比一个包含NUM个int 元素的数组
vector<int> ratings(NUM);
//类比一个包含NUM个string元素的数组
vector<string> titles(NUM);
//上面两个接口可见,容器使用动态内存分配
cout << "Your will do exactly as told , You will enter:" << endl;
int cnt = 0;
for(;cnt < NUM;cnt++) {
cout << "Enter title for #" << cnt + 1 << ':' << endl;
getline(cin,titles[cnt]);
cout << "Enter your ratings [0-9]:" << endl;
cin >> ratings[cnt];
cin.get(); //discard \n
}
//int cnt;
for(cnt=0;cnt < NUM; cnt++) {
cout << ratings[cnt] << '\t' << titles[cnt] << endl;
}
return 0;
}
2、vector 迭代器 与vector 成员函数方法
本质上是一个广义指针。可以使用解引用运算和递增运算(如同指针)
语法实现上是一个名称为iterator的typedef,形如
template< typename T>
class vector {
public:
typedef T* iterator;
}
示例代码:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
#define NUM 3
int main(void) {
//vector 类比数组
vector<double> nums(NUM);
//iterator 类比成员类型指针
vector<double>::iterator pd;
/*使用自动类型推断
auto pd = nums.begin();*/
//init nums ,使用数组的形式访问
int cnt = 0;
for(;cnt < NUM;cnt++) {
cin >> nums[cnt];
}
//print nums.使用迭代器,指针的形式访问
cnt = 0;
/*左闭 右开区间 [), {0 1 2 NULL} */
for(pd = nums.begin();pd < nums.end();pd++) {
cout << "#" << cnt++ << ':' << *pd << endl;
}
cout << "nums size = " << nums.size() << endl;
//push a new mem to vector end, size = 4. {0 1 2 3 NULL}
nums.push_back(100);
cout << "after push one nums size = " << nums.size() << endl;
/*erase (p1,p2), erase range[p1, p2)*/
nums.erase(nums.begin(), nums.begin() + 2);
cout << "after push one nums size = " << nums.size() << endl; //size =2
cout << nums[0] << endl; //?
cout <<nums[1] << endl; //100
/*insert (old, new1 , new2) [new, new2),插入到old前面*/
vector<double> tmp(2);
tmp[0] = 200;
tmp[1] = 300;
nums.insert(nums.begin(),tmp.begin(),tmp.end());
cout << nums[0] <<endl; //200
return 0;
}
3、容器与非成员方法函数
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct A {
public:
A (int i = 0) : m_int(i){}
int m_int;
};
/*begin 返回类型具有常属性*/
void print_A(A const &that) {
cout << that.m_int << endl;
}
int main() {
/*遍历容器的手动方法, begin retval const*/
vector<int> arr(4);
auto pi = arr.begin();
for(;pi < arr.end();pi++) {
print_A(*pi);
}
arr[0] = 2;
arr[1] = 1;
arr[3] = 3;
arr[2] = 0;
/*区间 apply 函数*/
for_each(arr.begin(), arr.end(),print_A);
/*sort 升序*/
sort(arr.begin(), arr.end());
for_each(arr.begin(), arr.end(),print_A);
/*random 排序*/
random_shuffle(arr.begin(), arr.end());
for_each(arr.begin(), arr.end(),print_A);
return 0;
}
4 基于范围的for循环结构 -std=c++11
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
double prices[5] = {10,20,30,40,50};
for(double x: prices){
cout << x << endl;
}
vector<double> nums(3);
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
for(auto x : nums) cout << x << endl;
return 0;
}