标签归档:vector

vector之迭代器iterator

1、除了用下标访问容器(包括vector)的元素外,标准库还提供了一种方法:使用迭代器(iterator)。

2、迭代器是一种 检查容器内元素并遍历元素的 数据类型。(概念上来理解)

3、标准库为每一种 标准容器(包括vector) 都定义了一种 迭代器类型。
因为迭代器对所有的容器都适用,只有少数容器支持下标操作,所以现在倾向于使用 迭代器 而不是 下标操作 来访问元素,即使对支持下标操作的vector也是一样。

4、迭代器和迭代器类型
容器的iterator类型:每一种容器都定义了自己的 迭代器类型,每个标准库容器都定义了一个名为iterator的成员,这里iterator与迭代器实际类型 (如vector::iterator)的含义相同。

vector::iterator  iter;
定义了一个变量iter,数据类型是 由vector 定义的 iterator类型

注意:iterator表示的含义
1)一般意义上指的是迭代器的概念
2)具体而言时,指的是 由容器定义的具体的 iterator类型,如vector。

重点理解:
1)有很多用做迭代器的类型,这些类型在概念上是相关的。
2)若一种类型支持 一组确定的操作,这些操作可用来 遍历容器内的元素,并访问这些元素的值, 我们就称这种类型为 迭代器。

综合之:各 容器 都定义了自己的 iterator类型 ,用于访问容器内的元素。
也就是每个 容器 都定义了一个名为 iterator 的类型,而这种类型支持 迭代器(概念上的)的各种操作。

5、容器的begin、end操作和 迭代器的操作
vector ivec ;
每种容器都定义了两个函数,begin() end(),用于返回迭代器

vector::iterator iter = ivec.begin()
如果容器ivec内有元素,则begin返回的迭代器指向第一个元素ivec[0]。

由end返回的迭代器 指向容器的 “末端元素的下一个”。
通常称为 超出末端迭代器(off-the-end iterator),表明它指向一个不存在的元素,它只起到一个哨兵的作用,表明已经处理完容器中所有的元素。
如果容器为空,则begin和end返回的迭代器相同。

迭代器类型的自增和解引用运算
自增:++
解引用:*    (其实和C语言中的指针运算差不多)
end()返回的迭代器不指向任何元素,因此不能对其进行自增和解引用操作。
比较操作: ==   !=  (两个迭代器对象指向同一个元素,则他们相等,否则不等)

vector迭代器还支持其他算术操作(其他标准库容器迭代器很少)
iter + n
iter – n
n为整型值,对迭代器对象加上或者减去一个整型值,将产生一个新的迭代器,位置是iter所指元素之前(加)或者之后(减)n个元素的位置。新的迭代器必须指向vector中某个元素,或者是vector末端的后一个元素。

iter1 – iter2 (iter1,iter2必须指向同一vector中元素,或者vector末端之后的下一个元素)
用来计算两个迭代器的距离,该距离是名为different_type的signed类型值,different_type类型和size_type类型相似,也是有vector定义的。

定位vector中间的元素

vector::iterator mid = vi.begin() + vi.size() / 2; 指向vi中最靠近中间的那一个

vector::iterator mid = (vi.begin() + vi.end()) / 2; //会产生什么结果?
vi.begin 和 vi.end() 返回的都是vector迭代器类型,不能进行除法操作。

注意:任何改变vector长度的操作都会使已存在的迭代器失效。
例如,在调用push_back()之后,就不能信赖指向vector的迭代器的值了。

6、const_iterator 和 const iterator对象
每一种容器还定义了一种名为const_iterator的类型,该类型只能用于读取元素,而不能改变元素。
使用const_iterator类型时,我们得到的迭代器所指向的对象不可变,但这个迭代器本身是可以改变。
const_iterator对象可以用于 const vector,也可以是非 const vector,因为它不能改写元素的值。

声明const迭代器时,必须进行初始化,一旦初始化,就不能改变它的值。(可以看出,const迭代器几乎没什么用,它指向的元素可变,但是不能使他指向任何其他元素)。

sort实现vector结构体排序

#include “stdafx.h”

 #include   <vector>  
 #include   <algorithm>
 #include <functional>
  
 using   namespace   std;  

struct AssessTypeInfo
{
unsigned int m_uiType;   //类型ID
 char   m_szName[64];  //类型名称
unsigned int m_uiTotal;   //总分数

};
 bool   lessmark(const   AssessTypeInfo&   s1,const   AssessTypeInfo&   s2)  
 {  
     return   s1.m_uiType   <   s2.m_uiType;  
 }

 bool   greatermark(const   AssessTypeInfo&   s1,const   AssessTypeInfo&   s2)  
 {  
     return   s1.m_uiType   >   s2.m_uiType;  
 }

int   main()  
 {  
  vector<AssessTypeInfo >   ctn   ;  
 
  AssessTypeInfo a1;
  a1.m_uiType=1;

  AssessTypeInfo  a2;
  a2.m_uiType=2;
  AssessTypeInfo  a3;
  a3.m_uiType=3;
  ctn.push_back(a1);
  ctn.push_back(a2);
  ctn.push_back(a3);
  sort(ctn.begin(), ctn.end(),lessmark)   ;   //升序排序
  
  for   ( int  i=0;   i<3;   i++   )  
   printf(“%d\n”,ctn[i].m_uiType);  
 

  sort(ctn.begin(), ctn.end(),greatermark)   ;   //降序排序

 
  return   0  ;  
 }

以上方法就可以实现升序排序,输出结果为 1  2   3 

降序排序结果3  2  1。

c++ vector各种函数介绍及其用法

构造函数
语法:
C++ Vectors可以使用以下任意一种参数方式构造:
vector();    //无参数 – 构造一个空的vector
vector( size_type num, const TYPE &val );   //数量(num)和值(val) – 构造一个初始放入num个值为val的元素的Vector
vector( const vector &from );    //构造一个与vector from 相同的vector
vector( input_iterator start, input_iterator end );    //迭代器(start)和迭代器(end) – 构造一个初始值为[start,end)区间元素的Vector(注:半开区间).
举例:
vector<int> v1( 5, 42 );    //构造了一个包含5个值为42的元素的Vector

关于vector

vector 用法实例

1.vector 的数据的存入和输出:

#include<stdio.h>

#include<vector>

#include <iostream>

using namespace std;

void main()

{

int i = 0;

vector<int> v;

for( i = 0; i < 10; i++ )

{

v.push_back( i );//把元素一个一个存入到vector中

}

/* v.clear()*/ 对存入的数据清空

for( i = 0; i < v.size(); i++ )//v.size() 表示vector存入元素的个数

{

cout << v[ i ] << ”  “; //把每个元素显示出来

}

cont << endl;

}

注:你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置。你也可以这样做:

继续阅读