STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数



1.STL(Standard Template Library,是用泛型技术来设计完成的实例)的概念与组成

Iterator(迭代器)

Container(容器)

Algorithm(算法)

Adaptors(配接器)

STL的六大组件分别是:

容器(Container)

算法(Algorithm)

迭代器(Iterator)

仿函数(Function object)

适配器(Adapter)

空间配置器(allocator):只能分配内存等

2.容器与算法

案例如下:

#include<iostream>

#include<vector>//容器

#include<array>//数组

#include<algorithm>

usingnamespacestd;

//实现一个模板类,专门实现打印的功能

template<classT> //类模板实现了方法

classmyvectorprint

{

public:

void
operator ()(constT
&t)//重载,使用(),打印

{

std::cout
<< t <<std::endl;

}

};

voidmain()

{

vector<int> myvector;

myvector.push_back(11);

myvector.push_back(21);

myvector.push_back(31);

myvector.push_back(81);

myvector.push_back(51);

array<int,
10> myarray = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };

myvectorprint<int>print;//对于打印进行实例化

//begin,endl迭代器,是一个指针

for_each(myvector.begin(),myvector.end(),print);

std::cout
<< "---------------------" <<std::endl;

for_each(myarray.begin(),myarray.end(),print);

cin.get();

//算法可以适用于任何一个容器,for_each是一个算法

}

3.容器

序列式容器(Sequence containers)

每个元素都有固定位置----取决于插入实际和地点,和元素之无关

Vector,deque,list

关联式容器(Associated containers)

元素位置取决于特定的排序准则,和插入顺序无关

set、multiset、map、multimap

4.vectors:

将元素置于一个动态数组中加以管理

可以随机存取元素(用索引直接存取)

数组尾部添加或移除元素非常快速,但是在中部或头部安插元素比较费时。

5.数组线程容器

#include<iostream>

#include<vector>

#include<array>

#include<tuple>

usingnamespacestd;

voidmain()

{

//数组,静态数组,栈上

array<int,
5> myarray = { 1, 2, 3, 4, 5 };

//动态数组,堆上

vector
<int>myvector;

myvector.push_back(1);

//不需要变长,容量较小时,使用array

//不需要变长,容量较大是,使用vector

}

6.list容器(添加和迭代输出)

#include<iostream>

#include<hash_set>

#include<list>   //实际上是一个双向链表

#include<stdio.h>

//list使用于经常插入,经常删除

usingnamespacestd;

voidmain()

{

list<int>mylist;

mylist.push_back(1);

mylist.push_back(2);

mylist.push_back(3);

mylist.push_back(4);

mylist.push_front(4);//往头部插入

//指针,指向一个迭代器,迭代器存储了位置

autoibegin
=mylist.begin();

autoiend
=mylist.end();

//list用迭代器进行遍历

for
(;ibegin !=iend;ibegin++)

{

cout
<< *ibegin <<endl;

printf("%p,&p\n",ibegin._Ptr,ibegin);//重载

}

cin.get();

}

运行结果是:

7.list删除应该注意的地方

#include<iostream>

#include<hash_set>

#include<list>   //实际上是一个双向链表

#include<stdio.h>

//list使用于经常插入,经常删除

usingnamespacestd;

voidmain()

{

list<int>mylist;

mylist.push_back(1);

mylist.push_back(2);

mylist.push_back(3);

mylist.push_back(4);

mylist.push_back(5);

//auto i = mylist.begin();删除元素,依赖于迭代器

//++i

//++i

//++i

autoi
=mylist.end();//end最后一个没有实体

i--;

mylist.erase(i);//链式存储,不允许下标访问

//只能用迭代器,链表迭代器只能用++,--

//mylist.clear();清空

//指针,指向一个迭代器,迭代器存储了位置

autoibegin
=mylist.begin();

autoiend
=mylist.end();

for
(;ibegin !=iend;ibegin++)

{

if
((*ibegin) == 3)

{

mylist.erase(ibegin);//删除,删除的时候迭代器会发生

break;//这里一定要记住,要使用break;因为list原来的结构已经发生了变化

}

//cout <<*ibegin << endl;

}

{

//指针,指向一个迭代器,迭代器存储了位置

autoibegin
=mylist.begin();

autoiend
=mylist.end();

for
(;ibegin !=iend;ibegin++)

{

cout
<< *ibegin <<endl;

}

}

cin.get();

}

运行结果:

8.通过数组的方式为list初始化

#include<iostream>

#include<hash_set>

#include<list>   //实际上是一个双向链表

#include<stdio.h>

//list使用于经常插入,经常删除

usingnamespacestd;

voidmain()

{

inta[5]
= { 1, 2, 3, 4, 5 };

list<int>mylist(a,a
+ 5);//根据数组初始化

//传递开始地址,传递结束地址

//mylist(0)

//mylist[1];只能用迭代器访问

mylist.push_back(10);

mylist.push_front(12);//在前添加数值

//指针,指向一个迭代器,迭代器存储了位置

autoibegin
=mylist.begin();

autoiend
=mylist.end();

for
(;ibegin !=iend;ibegin++)

{

if
(*ibegin == 3)

{

mylist.insert(ibegin,
30);

break;//删除或者插入,迭代器都会发生变化

}

}

mylist.remove(30);//直接一个函数,根据元素来删除

{

autoibegin
=mylist.begin();//指针,指向一个迭代器,迭代器存储了位置

autoiend
=mylist.end();

for
(;ibegin !=iend;ibegin++)

{

cout
<< *ibegin <<endl;

}

}

cin.get();

}

运行结果:

9.数组初始化,并逆向输出

#include<iostream>

#include<hash_set>

#include<list>   //实际上是一个双向链表

#include<stdio.h>

//list使用于经常插入,经常删除

usingnamespacestd;

voidmain()

{

inta[5]
= { 1, 2, 3, 4, 5 };

list<int>mylist(a,a
+ 5);//根据数组初始化

autorb
=mylist.rbegin();

autore
=mylist.rend();

//同时正向方向查找

for
(;rb !=re;rb++)

{

cout
<< *rb <<endl;

}

cin.get();

}

运行结果:

10.list合并,排序

#include<iostream>

#include<hash_set>

#include<list>   //实际上是一个双向链表

#include<stdio.h>

//list使用于经常插入,经常删除

usingnamespacestd;

voidmain()

{

inta[5]
= { 1, 2, 3, 104, 5 };

list<int
> mylist1(a,a
+ 5);//根据数组初始化,

intb[5]
= { 11, 122, 33, 44, 55 };

list<int
> mylist2(b,b
+ 5);//根据数组初始化,

mylist1.sort();

mylist2.sort();//两个list合并到list之前需要数组排序

mylist1.merge(mylist2);//合并之前必须有序

{

autoibegin
=mylist1.begin();//指针,指向一个迭代器,迭代器存储了位置

autoiend
=mylist1.end();

for
(;ibegin !=iend;ibegin++)

{

cout
<< *ibegin <<endl;

}

}

cout
<<"\n\n\n";

{

autoibegin
=mylist2.begin();//指针,指向一个迭代器,迭代器存储了位置

autoiend
=mylist2.end();

for
(;ibegin !=iend;ibegin++)

{

cout
<< *ibegin <<endl;

}

}

cin.get();

}

运行结果:

11.list中通过unique()方法去掉重复的元素

#include<iostream>

#include<hash_set>

#include<list>   //实际上是一个双向链表

#include<stdio.h>

//list使用于经常插入,经常删除

usingnamespacestd;

voidmain()

{

inta[6]
= { 1, 2, 98, 2, 5, 98 };

list<int>mylist1(a,a
+ 6);//根据数组初始化

{

autoibegin
=mylist1.begin();

autoiend
=mylist1.end();

for
(;ibegin !=iend;ibegin++)

{

cout
<< *ibegin <<endl;

}

}

mylist1.sort();

mylist1.unique();//唯一依赖于排序,通过这个方法实现了去掉重复的

cout
<<"\n\n\n";

{

//指针,指向一个迭代器,迭代器存储了位置

autoibegin
=mylist1.begin();

autoiend
=mylist1.end();

for
(;ibegin !=iend;ibegin++)

{

cout
<< *ibegin <<endl;

}

}

cin.get();

}

运行结果:

list迭代输出

#include<iostream>

#include<set>

#include<stdio.h>

#include<list>

#include<vector>

#include<algorithm>

#include<functional>

usingnamespacestd;

voidmain()

{

list<int>mylist;

mylist.push_back(1);

mylist.push_back(2);

mylist.push_back(3);

mylist.push_back(4);

//mylist[1];

autoibegin
=mylist.begin();//指针,指向一个迭代器,迭代器存储了位置

autoiend
=mylist.end();

//list用迭代器进行遍历

for
(;ibegin !=iend;ibegin++)

{

cout
<< *ibegin <<endl;

printf("%p,%p\n",ibegin._Ptr,ibegin);//重载

}

cin.get();

}

运行结果:

12算法find

#include<algorithm>

#include<iostream>

usingnamespacestd;

structprint

{

void
operator()(intx)//重载了()符号,直接调用()

{

std::cout
<< x <<endl;

}

};

voidprintA(intx)

{

std::cout
<< x <<endl;

}

//find这个算法

voidmain()

{

inta[10]
= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int
*p =find(a,a
+ 10, 8);

std::cout
<< (void*)a
<< (void*)(a
+ 10) << std::endl;

std::cout
<< *p <<endl;

std::cout
<< p <<endl;

if
(p == (a
+ 10))

{

std::cout
<< "没有找到\n";

}

//下面的方式是调用重载的print函数

for_each(a,a
+ 10,print());//遍历每一个元素

//printA是一个函数指针,必须是函数类型

std::cout
<< "-------------------------" <<std::endl;

for_each(a,a
+ 10,printA);

cin.get();

}

运行结果:

13.find_if,bind1st,仿函数

#include<iostream>

#include<set>

#include<stdio.h>

#include<list>

#include<vector>

#include<algorithm>  //find_if的头文件

#include<functional> //仿函数需要这里

usingnamespacestd;

boolless3(intx)

{

returnx
< 3;

}

voidmain()

{

vector<int>mylist;

mylist.push_back(1);

mylist.push_back(2);

mylist.push_back(16);

mylist.push_back(17);

mylist.push_back(18);

autoib
=mylist.begin();

autoie
=mylist.end();

for
(;ib !=ie;ib++)

{

std::cout
<< *ib <<std::endl;

}

//防函数可以实现一定的算法策略

//bind1st表示要绑定一个函数

//绑定一个函数,greater<int>(),3,表示比三大的数

//查找第一个比3大的数值,下面的代码的意思是找到第一个3比取出的数值大的数的位置

autoifind
=find_if(++mylist.begin(),mylist.end(),bind1st(greater<int>(),
3));

std::cout
<< "\n\n\n\n" << *ifind
<< endl;

std::cout
<< "---------------------" <<std::endl;

autoifind2
=find_if(mylist.begin(),mylist.end(),less3);

std::cout
<< "\n\n\n\n" << *ifind
<< endl;

cin.get();

}

时间: 2024-12-22 08:50:47

STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数的相关文章

vector数组用法及举例

vector详解 1.调用vector的头文件 注意:c++编程中填写这个头文件 2.vector的用法 注意:大概来讲,vector就是一个变长数组,与a[]这种普通数组不同的是,他不用定义多长,是根据用户的用法变化的,同时它的用法及方法也与普通数组不同 3.vector的存取方法及特殊 注意:vector的存取与栈相同(即一种无盖有底的“洞”,从顶端存入,从顶端取出): 3.vector数据的读取及其他方法 注意:iterator是一种迭代器,即一种读取器,其功能类似for循环:利用iter

【C++】STL,vector容器操作

C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头文件:#include <vector>.vector 是一个类模板.不是一种数据类型,vector<int>是一种数据类型.Vector的存储空间是连续的,list不是连续存储的. 一. 定义和初始化vector< typeName > v1;       //默认v1为

stl中的容器、迭代器和算法----vector中的find实现

来源 http://blog.csdn.net/huangyimin/article/details/6133650 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优缺点,不同的容器反映出程序设计的不同需求.容器自身可能由数组或链表实现,或者容器中的每个元素都有特殊的关键值. 迭代器 用于遍历一个数据集中的每个元素.这些数据集可能是容器或者容器的子集.迭代器的主要优点是它们为任意类型的容器提供一个小巧并且通用(注意通用很重要)的接口.例如,迭代器接口的一个操作

带你深入理解STL之Vector容器

C++内置了数组的类型,在使用数组的时候,必须指定数组的长度,一旦配置了就不能改变了,通常我们的做法是:尽量配置一个大的空间,以免不够用,这样做的缺点是比较浪费空间,预估空间不当会引起很多不便. STL实现了一个Vector容器,该容器就是来改善数组的缺点.vector是一个动态空间,随着元素的加入,它的内部机制会自行扩充以容纳新元素.因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,再也不必因为害怕空间不足而一开始就配置一个大容量数组了,vector是用多少就分配多少. 要

c++中的array数组和vector数组

我觉得实验一下会记得比较牢,话不多直接上代码. 下面是array数组,感觉用的不多. //cpp 风格数组 array #include <iostream> #include <array> #include <vector> using namespace std; int main() { array<int , 6> myint = {1 , 2 , 34, 45 , 0 , -2}; for(int i = 0 ; i < myint.siz

论STL的动态数组vector的基本应用

STL,就是c++的标准数据库,今天要讲的就是附属与它的vector的基本应用. 个人来说,我认为这个东东基本上没有什么用,但是总归得看懂吧... 这是一个动态的数组,可以随时定义它的大小(长度) 除了用万能头文件(bits/stdc++.h)的人,其它都要加上#include<vector>,如果只用BITS时报错,那就把这个加上吧. 定义位置:和定义普通数组一样. 定义方法:vector<数组类型名>数组名: 如果想定义多维数组,可以:vector<vector<数

C++笔记(6):标准模板库STL:容器、迭代器和算法

STL(Standard Template Library)是C++标准库的一部分.STL的代码从广义上讲分为三类:容器.迭代器和算法. 1.容器 2.迭代器 3.算法  -------------------------------------------------------------------------------------------------------------------------- 1.容器 顺序容器容器是特定类型对象的集合.顺序容器为程序员提供控制元素存储和访问

【转】【STL】vector详解

转自:http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors   vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector> 构造函数.

STL总结(vector)

STL概述: STL (Standard Template Library, 标准模板库) 是惠普实验室开发的一系列软件的统称.主要核心分为三大部分:容器(container).算法(algorithm)和迭代器(iterator),另外还有容器适配器(container adaptor)和函数对象(functor)等其它标准组件. 容器: 顺序容器: 名称 特性 vector 模拟的数据结构式动态数组,在内存中是连续储存的,支持随机存取,支持在尾部快速插入和删除元素,搜索速度较慢 deque