一 STL
STL提供了一组表示容器,迭代器,函数对象和算法的模板。容器是一个与数组类似的单元,可以存储若干值。STL容器是同质的,即存储的值的类型相同;算法是完成特定任务(如对数组进行排序或在链表中查找特定值)的处方;迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;函数对象是类似于函数的对象,可以是类对象或函数指针(包括函数名,因为函数名被用作指针)。STL使得构造各种容器(包括数组,队列和链表)和执行各种操作(包括搜索、排序和随机排列)。
二 vertor
在计算中,矢量(vector)对应数组。vector在头文件vector中定义了一个vector模板。要创建vector模板对象,可使用通常的<type>表示法来指出要使用的类型。另外,vector模板使用动态内存分配,因此可以用初始化参数来指出需要多少矢量:
#include <vector>
using namespace std;
vector<int> ratings(5);
int n;
cin >> n;
vector<double> scores(n);
由于操作符[] 被重载,因此创建vector对象后,可以使用通常的数组表示法来访问各个元素:
ratings[0] = 9;
for(int i = 0; i < n; i++)
{
cout << scores[i] << endl;
}
下面是一个示例:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
const int NUM = 5;
int _tmain(int argc, _TCHAR* argv[])
{
using std::vector;
using std::string;
using std::cin;
using std::cout;
using std::endl;
vector<int> ratings(NUM);
vector<string> titles(NUM);
cout << "You will do exactly as told.You will enter\n"
<< NUM << " book titles and your ratings(0 - 10).\n";
int i;
for(i = 0; i < NUM; i++)
{
cout << "Enter title #" << i + 1 <<": ";
getline(cin,titles[i]);
cout << "Enter your ratings(0 - 10): ";
cin >> ratings[i];
cin.get();
}
cout << "Thank you.You entered the following: \n"
<< "Ratings\tBook\n";
for (i = 0; i < NUM; i++)
{
cout << ratings[i] << "\t" << titles[i] << endl;
}
return 0;
}
除分配存储空间外,所有的STL容器都提供了一些基本方法,其中包括:
size() ---->返回容器中元素数目
swap() ---->交换两个容器的内容
begin() ---->返回一个指向容器中第一个元素的迭代器
end() ------>返回一个表示超过容器尾的迭代器
vector模板类也包含一些某些STL容器才用的方法:
push_back() ------>将元素添加到矢量末尾
pop_back() ------>弹出容器中最后一个元素
erase() ------->删除矢量中给定区间的元素
insert() ------>在给定区间插入元素
下面是一个使用示例:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
struct Review
{
std::string title;
int rating;
};
bool FillReview(Review & rr);
void ShowReview(const Review & rr);
int _tmain(int argc, _TCHAR* argv[])
{
using std::cout;
using std::vector;
vector<Review> books;
Review temp;
while(FillReview(temp))
books.push_back(temp);
int num = books.size();
if (num > 0)
{
cout << "Thank you.You entered the following: \n"
<< "Rating\tBook\n";
for (int i = 0; i < num; i++)
{
ShowReview(books[i]);
}
cout << "Reprising:\n"
<< "Rating\tBook\n";
vector<Review>::iterator pr;
for (pr = books.begin(); pr != books.end(); pr++)
{
ShowReview(*pr);
}
vector<Review> oldlist(books);
if (num > 3)
{
books.erase(books.begin() + 1,books.begin() + 3);
cout << "After erasure: \n";
for (pr = books.begin(); pr != books.end(); pr++)
{
ShowReview(*pr);
}
books.insert(books.begin(),oldlist.begin()+1,oldlist.begin()+2);
cout << "After insertion: \n";
for (pr = books.begin(); pr != books.end(); pr++)
{
ShowReview(*pr);
}
}
books.swap(oldlist);
cout << "Swapping oldlist with books: \n";
for(pr = books.begin(); pr != books.end(); pr++)
{
ShowReview(*pr);
}
}
else
cout << "Nothing enterd,nothing gained.\n";
return 0;
}
bool FillReview(Review & rr)
{
std::cout << "Enter bool title (quit to quit)";
std::getline(std::cin,rr.title);
if (rr.title == "quit")
{
return false;
}
std::cout << "Enter book rating: ";
std::cin >> rr.rating;
if(!std::cin)
return false;
std::cin.get();
return true;
}
void ShowReview(const Review & rr)
{
std::cout << rr.rating << "\t" << rr.title << std::endl;
}
我们通常要对数组执行很多操作,如搜索,排序,随机排序等。矢量模版类包含了执行这些常见的操作的方法吗?没有!STL从更广泛的角度顶一个非成员函数来执行这些操作,既不是为每个容器定义find()成员函数,而是定义了一个使用与所有容器类的非成员函数find()。这种设计理念省去了大量重复的工作。
下面来看看STL中具有代表性的3个函数:for_each(),random_shuffe()和sort()。for_each()函数可用于许多容器类,它接受3个参数。前两个是定义容器中区间的迭代器,最后一个是指向函数的指针(更普遍地说,最后一个参数是一个函数对象),可以用for_each()函数代替for循环。
Random_shuffe()函数接受两个指定区间的迭代器参数,并随机排列该区间中的元素。
sort()函数也要求容器支持随机访问。该函数有两个版本,第一个版本接受两个定义区间的迭代器参数,并使用为存储在容器中的类型元素顶一个的<操作符,对区间中的元素操作。另一个接受3个参数,前两个参数也是指定区间的迭代器,最后一个参数是指向要使用的函数指针(函数对象)。
下面是一个使用示例:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
struct Review
{
std::string title;
int rating;
};
bool operator< (const Review & r1,const Review & r2);
bool worseThan(const Review & r1,const Review & r2);
bool FillReview(Review & rr);
void ShowReview(const Review & rr);
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
vector<Review> books;
Review temp;
while(FillReview(temp))
books.push_back(temp);
cout << "Thank you.You entered the following: \n"
<< 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);
random_shuffle(books.begin(),books.end());
cout <<"After shuffing:\nRaing\tBook\n";
for_each(books.begin(),books.end(),ShowReview);
cout << "Bye."<<endl;
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)
{
std::cout << "Enter bool title (quit to quit)";
std::getline(std::cin,rr.title);
if (rr.title == "quit")
{
return false;
}
std::cout << "Enter book rating: ";
std::cin >> rr.rating;
if(!std::cin)
return false;
std::cin.get();
return true;
}
void ShowReview(const Review & rr)
{
std::cout << rr.rating << "\t" << rr.title << std::endl;
}
输出结果:
参考书籍 c++ primer plus 第五版中文版
vector 源码剖析
http://blog.csdn.net/hackbuteer1/article/details/7724547
vector 详细介绍