c++ STL之vector使用

        一 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 详细介绍

http://software.intel.com/zh-cn/blogs/2011/08/10/c-vector/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值