标准模板库
可对矢量执行的操作
所有的STL容器都提供了一些基本方法,其中包括size()-返回容器中元素数目,swap()-交换两个容器的内容,begin()-返回一个指向容器中第一个元素的迭代器,end()-返回一个表示超过容器尾的迭代器。
什么是迭代器?
迭代器是一个广义的指针,它可以是指针,也可以是一个可对其执行类似指针操作的对象。
迭代器存在的意义?
通过将指针广义化为迭代器,让STL能够为各种不同的容器类(包括那些简单指针无法处理的类)提供统一的接口。
迭代器的用法?
要为vector的double类型规范声明一个迭代器,可以这样做
vector<double>::iterator pd;
//假设scores是一个 vector<double> 对象,则可以使用迭代器pd执行这样的操作
pd = score.begin(); //pd指向第一个元素
*pd = 22.3; //赋值
++pd; //让pd指向下一个元素
可以用下面的代码来显示容器的内容
vector<string> titles(NUM);
vector<string>::iterator pd;
pd=titles.begin();
for(;pd != titles.end(); pd++)
{
cout << *pd <<endl;
}
vector模板类也包含一些只有某些STL容器才有的方法。如
push_back()
erase()
insert()
push_back()方法,将元素添加到矢量末尾。这样做时,它将负责内存管理,增加矢量的长度,使之能够容纳新的成员。
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char *argv[])
{
vector<double> score; //创建一个空的vector
double temp;
while(cin >> temp && temp >= 0)
{
score.push_back(temp);
}
cout << "you entered " << score.size() << " scores.\n";
vector<double>::iterator pd;
pd=score.begin();
for(;pd != score.end(); pd++)
{
cout << *pd <<endl;
}
return 0;
}
这样写的好处?
在编写或运行程序时,无需了解元素的数目。只要能够取得足够的内存,程序就可以根据需要增加scores的长度
erase()方法删除矢量中给定区间的元素
insert()方法在矢量中的给定区间插入元素
对矢量可执行的其他操作
矢量模板类包含了执行常见操作,如搜索,排序,随机排序的方法了么?
没有!
STL的解决方案?
STL从更广泛的的角度定义了非成员函数来执行这些操作
STL这样解决的原因?
1)省去了大量重复的工作
2)即使有执行相同任务的非成员函数,STL有时也会定义一个成员函数。这是因为对有些操作来说,类特定算法的效率比通用算法的高。
for_each()函数的用法?
它接收3个参数,前两个是定义容器中的区间的迭代器,最后一个是指向函数的指针。for_each()函数将被指向的函数应用于容器区间中的各个元素。被指向的函数不能修改容器元素的值
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void Show(const double &rr)
{
cout << rr << endl;
}
int main(int argc, char *argv[])
{
vector<double> score; //创建一个空的vector
double temp;
while(cin >> temp && temp >= 0)
{
score.push_back(temp);
}
cout << "you entered " << score.size() << " scores.\n";
for_each(score.begin(),score.end(),Show);
return 0;
}
Random_shuffle()函数用法?
random_shuffle()函数接收两个指定区间的迭代器参数,并随机排列该区间中的元素。
random_shuffle()该函数要求容器类允许随机访问
sort()函数的用法?
DEMO 以上三种STL函数的用法
/*
* 演示STL函数的用法
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Review{
string title;
int rating;
};
bool operator <(const Review & r1, const Review & r2);
bool worseThan(const Review & r1, const Review & r2);
bool FillReview(Review & rr);
bool ShowReview(const Review & rr);
int main(int argc, char *argv[])
{
vector<Review> books;
Review temp;
while(FillReview(temp))
{
books.push_back(temp);
}
if(books.size() > 0)
{
cout << "Thank you .You entered the following "
<< books.size() << " ratings:\n"
<< "Rating\tBook\n";
for_each(books.begin(), books.end(), ShowReview);
//排序
sort(books.begin(), books.end());
cout << "Sorted by title:\nRating\tBook\n";
for_each(books.begin(), books.end(), ShowReview);
sort(books.begin(),books.end(),worseThan);
cout << "Sorted by rating:\nRating\tBook\n";
for_each(books.begin(), books.end(), ShowReview);
random_shuffle(books.begin(),books.end());
cout << "After shuffling:\nRating\tBook\n";
for_each(books.begin(), books.end(), ShowReview);
}
else
{
cout << "No entries:";
}
cout << "Bye.\n";
return 0;
return 0;
}
bool operator <(const Review & r1,const Review & r2)
{
if(r1.title < r2.title)
{
return true;
}
else if(r1.title == r2.title && r1.rating < r2.rating)
{
return true;
}
else
{
return false;
}
}
bool worseThan(const Review &r1, const Review &r2)
{
if(r1.rating < r2.rating)
{
return true;
}
else
{
return false;
}
}
bool FillReview(Review &rr)
{
cout << "Enter book title (quit to quit): ";
getline(cin,rr.title);
if(rr.title == "quit")
{
return false;
}
cout << "Enter book rating: ";
cin >> rr.rating;
if(!cin)
{
return false;
}
while(cin.get() != '\n')
continue;
return true;
}
bool ShowReview(const Review & rr)
{
cout << rr.rating << "\t" << rr.title << endl;
}
运行结果
基于范围的for循环(C++11)
泛型编程
为何使用迭代器
迭代器类型
迭代器层次结构
概念,改进和模型
容器种类
容器的概念?
容器是存储其他对象的对象,被 存储的对象必须是同一种类型的,他可以是OOP意义上的对象,也可以是内置类型值。存储在容器中的数据为容器所有,这意味着容器过期时,存储在容器中的数据也将过期。
不能将任何类型的对象存储在容器中,具体的说,类型必须是可复制构造的和可赋值的。基本类型满足这些要求,只要类定义没有将复制构造函数和赋值运算声明为私有或保护的,则也满足这种要求。