【学习笔记】《STL使用入门教程》第二讲:模版、容器vector和迭代器

晓石头的博客
邮箱:178673693@qq.com
转载请注明出处,原文链接:http://blog.csdn.net/qiulanzhu/article/details/50458141


一、模版


1函数模版:实现类型参数化,避免定义多个函数

例:

#include "stdafx.h"
#include <iostream>
using namespace std;

template<typename T>	//或者template<class T>
T myMax(T a, T b)
{
	return a>b ? a : b;
}

int main(int argc, char* argv[])
{
	int ret1 = myMax(15, 30);
	float ret2 = myMax(1.3, 3.6);
	char ret3 = myMax('a', 'c');

	cout<<ret1<<endl;
	cout<<ret2<<endl;
	cout<<ret3<<endl;
	return 0;
}

2类模版:避免写多个类

#include "stdafx.h"
#include <iostream>
using namespace std;

template<class T>

class MyMax
{
public:
	MyMax(T a, T b):m_a(a),m_b(b){};
	T GetMax(){ return m_a>m_b ? m_a : m_b; };

private:
	T m_a;
	T m_b;
};


int main(int argc, char* argv[])
{
	MyMax<int> TestMaxInt(11, 55);
	int ret1 = TestMaxInt.GetMax();

	MyMax<char> TestMaxChar('a', 'z');
	char ret2 = TestMaxChar.GetMax();
	
	cout<<ret1<<endl;
	cout<<ret2<<endl;
	return 0;
}


可以指定多种类型的形参

template<typename T1, typename T2>  

 

二、容器vector

1vector对象的默认构造

vector采用模版类实现,vector对象的默认构造形式:vector<T> vecT;RU

如:

vector<int> vecInt;  //存放intvector容器

vector<float> vecFloat; //存放floatvector容器

vector<string> vecString; //存放stringvector容器

...   //尖括号内还可以是指针类型和自定义类型

 

class CA{};

vector<CA*> vecpCA;  //用于存放CA对象的指针的vector容器。

vector<CA> vecCA;    //用于存放CA对象的vector容器,由于容器元素的存放是按值复制的方式进行的,所以,此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常。

 

2vector对象的带参数构造

int iArray[] = {0,1,2,3,4};

vector<int> vecInt1(iArray, iArray+5);

vector<int> vecInt2(vecInt1.begin(), vecInt1.end());

vector<int> vecInt(3, 9);//容器里存放39

 

3vector的赋值

vector.assign(beg,end);//[beg,end)区间的数据拷贝赋值给本身。区间是左闭右开。

例:

int iArray[] = {1,2,3,4,5,6};

vector<int> vecInt1(iArray, iArray+6);

vector<int> vecInt;

vecInt.assign( vecInt1.begin()+1, vecInt1.begin()+3 );

 

vector.assign(n, elem);//n个元素拷贝赋值给本身

例:vec.assign(3, 9);

 

vector& operator=(const vector &vec);//重载等号操作符

例:vet1 = vec2;

 

4vector的数据存取

vec.at(idx)//返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。

vec[idx];//返回索引idx所指的数据。

vec.front();//返回最前一个值,等价vec.at(0)

vec.back();//返回最后一个值

 

5vector的大小

vector.size();//容器中元素的个数

vector.empty();//判断容器是否为空

vector.resize(num)//重新指定容器的长度为:num

 //长度变长,默认用0填充,长度变短,裁剪后面的元素

vector.resize(num, elem);//用指定元素填充

 

6vector插入---增

iterator vector.insert(iterator loc, elem);//在位置pos插入元素elem的拷贝,返回新元素位置

例:

vector<int> vecInt(3,9);

vector<int>::iterator it = vecInt.insert(vecInt.begin(), 10);

 

void vector.insert(iterator loc, int n, elem)//在位置pos插入n个元素

例:vecInt.insert(vecInt.begin, 3, 8);

 

void vector.insert(iterator loc, beg, end);//在位置pos插入区间[beg, end)元素

例:vecInt.insert(vecInt.begin, vecInt1.begin(), vecInt1.end());

 

7vector的删除---删

vector.clear();//移除容器的所有数据

vec.erase(beg, end);//删除区间[beg, end)的数据,返回下一个数据的位置

例:vecInt.erase(vecInt.begin(), vecInt.end()-1);

 

vec.erase(iterator loc);//删除loc位置的数据,返回下一个数据的位置

例:vecInt.erase(vecInt.begin()+1);


8vector容器元素互换---改

vec1vec2元素互换

例:vec1.swap(vec2);//或者swap(vec1, vec2);


 

9vector末尾的添加和移除操作---改

vector.push_back(elem);

vector.pop_back();

:

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char* argv[])
{
	vector<int> vecInt;
	vecInt.push_back(1);
	vecInt.push_back(2);
	vecInt.push_back(3);
	vecInt.push_back(4);
	vecInt.push_back(5);

	vector<int>::iterator iter;
	for(iter = vecInt.begin(); iter != vecInt.end(); iter++)
	{
		cout<<*iter<<endl;
	}

	cout<<endl;

	vecInt.pop_back();
	for(iter = vecInt.begin(); iter != vecInt.end(); iter++)
	{
		cout<<*iter<<endl;
	}

	return 0;
}

三、迭代器

1双向迭代器和随机访问迭代器 

双向迭代器支持的操作:

it++,++it,it--,--it,*it,itA=itB,itA==itB,itA!=itB

支持双向迭代器的容器有:list,set,multiset,map,multimap

 

随机访问迭代器支持的操作:

在双向迭代器的操作基础上增加:

it+=i,it-=i,it[i],itA<itB,itA<=itB,itA>itB,itA>=itB

支持随机访问迭代器的容器有:vector,deque

ps:++it的效率高于it++,因为前者返回的是引用,后者返回的是值。

 

2vector与迭代器的配合使用

vec.begin();//容器中第一个元素的迭代器

vec.end();//容器中最后元素的后面一个元素的迭代器

 

正向迭代器:

vector<int>::iterator iter;

for(iter = vecInt.begin(); iter != vecInt.end(); iter++)

{

cout<<*iter<<" ";

}

 

反向迭代器:

vector<int>::reverse_iterator riter;

for(riter = vecInt.rbegin(); riter != vecInt.rend(); riter++)

{

cout<<*riter<<" ";

}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值