码迷,mamicode.com
首页 > 编程语言 > 详细

c++进阶之路04STL知识

时间:2015-04-26 01:51:46      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

  1. 模板把函数或类要处理的数据类型参数化,即表现为参数的多态性。是一种代码重用机制。函数模板有多种重载方式,可以定义同名的函数模板,提供不同的参数和实现;也可以用其他非函数模板重载。

  2. 函数模板,没有普通函数的类型转换机制。所以有时用普通函数去重载函数模板。函数是找特定的函数,再找函数模板。

  3. 与函数模板不同的是:函数模板的实例化是编译系统在处理函数调用时自动完成,而类模板的实例化必须有程序员在程序中显式指定。

  4. C++包含一个有许多组件的标准库。标准模版库是标准C++标准库的一部分。STL中主要有3种组件:容器,迭代器,算法。

  5. 容器是数据结构,是包含对象的对象。容器是常用数据结构的类模版。容器的分类:顺序容器和关联容器。

  6. 顺序容器:vector,deque,list,关联容器:set,multiset,map,multimap

  7. 顺序容器是一组具有相同类型的元素以严格的线性形式组织起来。有vector,deque,list,deque是vector和list的混合体。

    vector的基本操作:


一、 定义和初始化

vector< typeName > v1;       //默认v1为空,故下面的赋值是错误的v1[0]=5;

vector<typeName>v2(v1); 或v2=v1;或vector<typeName> v2(v1.begin(), v1.end());//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被扩充为v1.size()。

vector< typeName > v3(n,i);//v3包含n个值为i的typeName类型元素

vector< typeName > v4(n); //v4含有n个值为0的元素

int a[4]={0,1,2,3,3}; vector<int> v5(a,a+5);//v5的size为5,v5被初始化为a的5个值。后一个指针要指向将被拷贝的末元素的下一位置。

vector<int> v6(v5);//v6是v5


   

二、vector对象最重要的几种操作

1. v.push_back(t)    在容器的最后添加一个值为t的数据,容器的size变大。

    另外list有push_front()函数,在前端插入,后面的元素下标依次增大。

2. v.size()        返回容器中数据的个数,size返回相应vector类定义的size_type的值。v.resize(2*v.size)或                  


v.resize(2*v.size, 99) 将v的容量翻倍(并把新元素的值初始化为99)

3. v.empty()     判断vector是否为空

4. v[n]           返回v中位置为n的元素

5. v.insert(pointer,number, content)    向v中pointer指向的位置插入number个content的内容。

    还有v. insert(pointer, content),v.insert(pointer,a[2],a[4])将a[2]到a[4]三个元素插入。

6. v.pop_back()    删除容器的末元素,并不返回该元素。

7.v.erase(pointer1,pointer2) 删除pointer1到pointer2中间(包括pointer1所指)的元素。

   vector中删除一个元素后,此位置以后的元素都需要往前移动一个位置,虽然当前迭代器位置没有自动加1,

   但是由于后续元素的顺次前移,也就相当于迭代器的自动指向下一个位置一样。

8. v1==v2          判断v1与v2是否相等。

9. !=、<、<=、>、>=      保持这些操作符惯有含义。

10. vector<typeName>::iterator p=v1.begin( ); p初始值指向v1的第一个元素。*p取所指向元素的值。

      对于const vector<typeName>只能用vector<typeName>::const_iterator类型的指针访问。

11.   p=v1.end( ); p指向v1的最后一个元素的下一位置。

12.v.clear()      删除容器中的所有元素。12.v.clear()      删除容器中的所有元素。


using namespace std;


bool com(int x)

{

if(x % 9 == 0)

return true;

else

return false;

}


template<typename T>

void show(T t)

{

for(T::iterator it = t.begin(); it != t.end(); it++)

cout<<*it<<" ";

cout<<endl;

}


int _tmain(int argc, _TCHAR* argv[])

{

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

vector<int> v1(10);

show(v1);

vector<int> v2;

show(v2);

vector<int> v3(10,1);

show(v3);

vector<int> v4(a, &a[3]);

show(v4);

vector<int> v5;

for(int i = 0; i < 11; i++)

v5.push_back(i);

show(v5);

cout<<v2.size()<<endl;

v2 = v5;

cout<<v2.size()<<endl;

show(v2);

cout<<"vector的初始化"<<endl;

cout<<"--------------------------------"<<endl;

cout<<v3.empty()<<endl;

v2.resize(2 * v2.size());

cout<<v2.size()<<endl;

v2.resize(2 * v2.size(), 99);

show(v2);

while(v2.size() != 11)

{

v2.pop_back();

}

show(v2);

v2.erase(v2.begin(), v2.begin() + 1);

show(v2);

v2.clear();

show(v2);

cout<<"vector的操作"<<endl;

cout<<"----------------------------------------"<<endl;

show(v5);

cout<<*(find(v5.begin(),v5.begin() + 10, 14))<<endl;  //找不到就返回end()的值,没有的话程序异常

cout<<*(find_if(v5.begin() + 1,v5.begin() + 10, com))<<endl;

system("pause");

return 0;

}


deque的操作与vector类似,下面介绍deque的内存是不是和vector一样。


int _tmain(int argc, _TCHAR* argv[])

{

vector<int> v1(2);

deque<int> d1(2);

int* p1 = &v1[0];

int* p2 = &d1[0];


cout<<*p1<<","<<p1<<endl;

cout<<*p2<<","<<p2<<endl;


v1.push_back(20);

d1.push_back(20);


cout<<*p1<<","<<p1<<endl;

cout<<*p2<<","<<p2<<endl;


cout<<v1[0]<<","<<&v1[0]<<endl;


system("pause");

return 0;

}


原因为,在建立vector容器时,一般来说伴随这建立空间->填充数据->重建更大空间->复制原空间数据->删除原空间->添加新数据,如此反复,保证vector始终是一块独立的连续内存空间;在建立deque容器时,一般便随着建立空间->建立数据->建立新空间->填充新数据,如此反复,没有原空间数据的复制和删除过程,是由多个连续的内存空间组成的。



nt _tmain(int argc, _TCHAR* argv[])

{

list<int> L1;

for(int i = 0; i < 11; i++)

L1.push_back(i);


list<int>::reverse_iterator it = L1.rbegin();

cout<<*it<<endl;


show(L1);

reverse(L1.begin(),L1.end());

show(L1);


cout<<"---------------------------------"<<endl;

list<int> L2;

L2.push_back(3);

L2.push_back(1);

L2.push_back(5);

L2.sort();

//L2.reverse();

show(L2);


list<int> L3;

L3.push_back(7);

L3.push_back(6);

L3.push_back(8);

L3.sort();

//L3.reverse();

show(L3);


L2.merge(L3);

show(L2);

show(L3);


//L2.splice(L2.begin(),L3);

//show(L2);

//show(L3);


system("pause");

return 0;

}

需要清楚merge()和splice()的区别。


关联容器具有根据一组索引来快速提取元素能力,其中元素可以通过键(KEY)来访问。

set是一种集合,其中包含0个或多个不重复的以及不排序的元素,这些元素被称为键值。multiset是允许有重复键值的set的。

map是一种映像,其中可包含0个或多个不排序的元素对,一个元素是不重复的键值,另外一个是与键相关的值。multimap允许有重复的键值的map。



本文出自 “郭俊的博客” 博客,转载请与作者联系!

c++进阶之路04STL知识

标签:

原文地址:http://10093949.blog.51cto.com/10083949/1638269

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!