C++强大的原因之一是得益于他强大的标准模板库
标准模板库 简称STL (Standard Template Library)
STL为程序员提供了强大的功能,例如类似于数组操作:数组的计算,数组的大小,数组的排序,数组的插入等等。
STL的六大组件
容器:存放数据
算法:处理数据
迭代器:对容器进行通用表示
仿函数:通用的处理数据
适配器:修饰容器或者仿函数改变其特性
配置器:负责空间的配置和管理
vector,STL中常用的容器
包含在头文件
用
#include
#include
using namespace std;
int main()
{
const int n = 10;
//initialized length = 10
vector vec (n);
for(int i=0;i> vec[i];
}
for(int i=0;i
运行结果
可对vector执行的操作
cout << "\nSize is " << vec.size();
交换两个容器内的内容
#include
#include
using namespace std;
int main()
{
const int n = 3;
//initialized length = 10
vector vec1 (n);
vector vec2 (n);
for(int i=0;i
运行结果
容器和迭代器
在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。
简单点来说就是存储数据用的(当然不只是存储),形象的把他称为容器。
迭代器是一种检查容器内元素并遍历元素的数据类型。 C++更趋向于使用迭代器而不是下标操作。
简单的来说他是一个广义指针(也可以是一个指针),可以使用类似指针的操作(如解引用,自增)。
就像用数组下表模拟指针一样,模拟指针的int类型就相当于一个广义上的指针。
两个类方法
begin()——返回指向容器中起一个元素的迭代器。
end() ——返回一个表示超过容器尾部的迭代器(其实就是最后一个元素的下一个,类似于c风格字符串中的'\0')。
标准库为每一种标准容器(如vector)定义了一种迭代器类型,而只有少数容器(如vector)支持下标操作访问容器元素。 每种容器都定义了自己的迭代器类型,如vector: 每种容器都定义了一对名为begin和en的函数,用于返回迭代器。 下面对迭代器进行初始化操作: 注意end并不指向容器的任何元素,而是指向容器的最后元素的下一位置,称为超出末端迭代器。 如果vector为空,则begin返回的迭代器和end返回的迭代器相同。
迭代器的类型是一个名为iterator的typedef(就像string那样)。其作用域为整个类。
可以用迭代器代替下标历遍容器,代码如下
#include
#include
#include
using namespace std;
int main()
{
srand(time(NULL));
const int n = 10;
//initialized length = 10
vector vec (n);
vector::iterator pvec;
for(int i=0;i
运行结果
接着来说vector的类方法
push_back()——将元素添加到容器末尾,内存不够时自动开辟。
#include
#include
#include
using namespace std;
int main()
{
srand(time(NULL));
const int n = 10;
//initialized length = 10
vector vec (n);
vector::iterator pvec;
cout << "Before Size is " << vec.size() << endl;
for(int i=0;i
运行结果
erase()——删除给定区间中的元素,它接受两个迭代器作为参数。起一个迭代器指向删除元素的启示位置,并且删除,第二个迭代器参数指向区间末尾,并且不删除。即删除[a, b)
#include
#include
#include
using namespace std;
int main()
{
srand(time(NULL));
const int n = 10;
vector vec (n);
vector::iterator pvec;
for(int i=0;i
insetr()——将一个容器中的区间插入到另一个容器中的指定位置。他接受三个迭代器参数。
第一个迭代器指向被插入容器的位置。后两个迭代器表示源容器的插入区间 [a, b)
#include
#include
#include
using namespace std;
int main()
{
vector old_vec (10,5);
vector new_vec (10,6);
for(int i=0;i<10;i++){
old_vec[i] = i ;
}
new_vec.insert(new_vec.begin()+3,old_vec.begin()+4,old_vec.begin()+6);
auto pv = new_vec.begin(); //C++11
for(; pv < new_vec.end(); pv++){
cout << *pv << " ";
}
return 0;
}
运行结果
通用的STL函数
for_each()——可代替for循环的函数(
#include
#include
#include
using namespace std;
void show(int & a)
{
cout << "这个元素是" << a << endl;
}
int main()
{
const int n = 10;
void (*pfunc) (int&) = show;
vector vec (n,6);
for(int i=0;i::iterator pvb = vec.begin();
auto pve = vec.end();
for_each(pvb, pve, pfunc);
return 0;
}
运行结果
random_shuffle()接受两个迭代器指向容器的区间,并对其随机排列。
random_shuffle(pvb,pve);
运行结果
sotr()——该函数有两个重载版本,其中一个版本接受两个指向容器元素的迭代器,代表一个区间,对其进行升序排序(使用模板类自带的重载后的 < ),如果是用户自定义的 数据类型,则需要重载 < 。
#include
#include
#include
using namespace std;
void show(int & a)
{
cout << a << " ";
}
int main()
{
const int n = 10;
void (*pfunc) (int&) = show;
vector vec (n,6);
for(int i=0;i::iterator pvb = vec.begin();
auto pve = vec.end();
random_shuffle(pvb,pve);
for_each(pvb, pve, pfunc);
sort(pvb,pve);
cout << endl;
for_each(pvb, pve, pfunc);
return 0;
}
另一个重载版本则:前两个参数不变,后一个参数接受一个函数指针(返回值为bool类型),true和false表示调用函数的两个参数顺序是否正确。如果不正确则变为正确的顺序。这样做就可以变为升序排序。
bool compare(int &a, int &b)
{
return a > b;
}
#include
#include
#include
using namespace std;
void show(int & a)
{
cout << a << " ";
}
bool compare(int &a, int &b)
{
return a > b;
}
int main()
{
const int n = 10;
void (*pfunc) (int&) = show;
vector vec (n,6);
for(int i=0;i::iterator pvb = vec.begin();
auto pve = vec.end();
random_shuffle(pvb,pve);
for_each(pvb, pve, pfunc);
sort(pvb,pve, compare);
cout << endl;
for_each(pvb, pve, pfunc);
return 0;
}
类似的其他类型也可以使用以上函数,例如string,char,double。
#include
#include
#include
using namespace std;
void show(double & a)
{
cout << a << " ";
}
bool compare(double &a, double &b)
{
return a > b;
}
int main()
{
const int n = 10;
void (*pfunc) (double&) = show;
vector vec (n,6);
for(int i=0;i::iterator pvb = vec.begin();
auto pve = vec.end();
random_shuffle(pvb,pve);
for_each(pvb, pve, pfunc);
sort(pvb,pve, compare);
cout << endl;
for_each(pvb, pve, pfunc);
return 0;
}
运行结果
#include
#include
#include
using namespace std;
void show(string & a)
{
cout << a << endl;
}
int main()
{
const int n = 5;
void (*pfunc) (string&) = show;
vector vec (n);
vec[0] = "begin";
vec[1] = "hello";
vec[2] = "world";
vec[3] = "C++";
vec[4] = "STL use";
auto pvb = vec.begin(); //vector::iterator pvb = vec.begin();
auto pve = vec.end();
random_shuffle(pvb,pve);
for_each(pvb, pve, pfunc);
sort(pvb,pve);
cout << endl;
for_each(pvb, pve, pfunc);
return 0;
}
运行结果
也可以使用这样的for循环,就像使用int,double的那样。
#include
using namespace std;
int main()
{
int num[10] = {1,2,3,5,4,6,9,8,7,0};
for(int a : num){
cout << a << " ";
}
return 0;
}
#include
#include
using namespace std;
int main()
{
const int n = 5;
vector vec (n);
vec[0] = "begin";
vec[1] = "hello";
vec[2] = "world";
vec[3] = "C++";
vec[4] = "STL use";
for(auto & x : vec){
cout << x << endl;
}
return 0;
}
运行结果