栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

详解C++编程中的vector类容器用法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解C++编程中的vector类容器用法

vector简介
vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。

vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。

vector的数据结构
vector数据结构,采用的是连续的线性空间,属于线性存储。他采用3个迭代器_First、_Last、_End来指向分配来的线性空间的不同范围,下面是声明3个迭代器变量的源代码。

template > 
class vector{ 
... 
protected: 
iterator _First, _Last, _End; 
};

_First指向使用空间的头部,_Last指向使用空间大小(size)的尾部,_End指向使用空间容量(capacity)的尾部。例如:

int data[6]={3,5,7,9,2,4}; 
vector vdata(data, data+6); 
vdata.push_back(6); 
...

vector初始化时,申请的空间大小为6,存放下了data中的6个元素。当向vdata中插入第7个元素“6”时,vector利用自己的扩充机制重新申请空间,数据存放结构如图所示:

简单描述一下。当插入第7个元素“6”时,vector发现自己的空间不够了,于是申请新的大小为12的内存空间(自增一倍),并将前面已有数据复制到新空间的前部,然后插入第7个元素。此时_Last迭代器指向最后一个有效元素,而_End迭代器指向vector的最后有效空间位置。我们利用vector的成员函数size可以获得当前vector的大小,此时为7;利用capacity成员函数获取当前vector的容量,此时为12。


vector容器类型
vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象)。vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的。
vector的构造

函数原型:

template
explicit vector();   // 默认构造函数,vector对象为空
explicit vector(size_type n, const T& v = T());  // 创建有n个元素的vector对象
vector(const vector& x);
vector(const_iterator first, const_iterator last);

注:vector容器内存放的所有对象都是经过初始化的。如果没有指定存储对象的初始值,那么对于内置类型将用0初始化,对于类类型将调用其默认构造函数进行初始化(如果有其它构造函数而没有默认构造函数,那么此时必须提供元素初始值才能放入容器中)。

举例:

vector v1;     // 创建空容器,其对象类型为string类
vector v2(10);   // 创建有10个具有初始值(即空串)的string类对象的容器
vector v3(5, "hello"); // 创建有5个值为“hello”的string类对象的容器
vector v4(v3.begin(), v3.end()); // v4是与v3相同的容器(完全复制)

vector的操作(下面的函数都是成员函数)

bool empty() const;   // 如果为容器为空,返回true;否则返回false
size_type max_size() const;      // 返回容器能容纳的最大元素个数
size_type size() const; // 返回容器中元素个数 
size_type capacity() const;      // 容器能够存储的元素个数,有:capacity() >= size() 
void reserve(size_type n);// 确保capacity() >= n
void resize(size_type n, T x = T());  // 确保返回后,有:size() == n;如果之前size()

vector对象的比较(非成员函数)

针对vector对象的比较有六个比较运算符:operator==、operator!=、operator<、operator<=、operator>、operator>=。

其中,对于operator==和operator!=,如果vector对象拥有相同的元素个数,并且对应位置的元素全部相等,则两个vector对象相等;否则不等。
对于operator<、operator<=、operator>、operator>=,采用字典排序策略比较。

注:其实只需要实现operator==和operator!=就可以了,其它可以根据这两个实现。因为,operator!= (lhs, rhs) 就是 !(lhs == rhs),operator<=(lhs, rhs) 就是 !(rhs < lhs),operator>(lhs, rhs) 就是 (rhs < lhs),operator>=(lhs, rhs) 就是 !(lhs, rhs)。

vector类的迭代器

vector类的迭代器除了支持通用的前缀自增运算符外,还支持算术运算:it + n、it - n、it2 - it1。注意it2 - it1返回值为difference_type(signed类型)。

注意,任何改变容器大小的操作都可能造成以前的迭代器失效。

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

#include
#include
#include 
using namespace std;
void main()
{
 int i = 0;
  vector v;
  for( i = 0; i < 10; i++ )
 {
      v.push_back( i );//把元素一个一个存入到vector中
 }
对存入的数据清空
 for( i = 0; i < v.size(); i++ )//v.size() 表示vector存入元素的个数
 {
     cout << v[ i ] << " "; //把每个元素显示出来
 }
 cont << endl;
}

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

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

2. 对于二维vector的定义。
(1)定义一个10个vector元素,并对每个vector符值1-10。

#include
#include
#include 
using namespace std;
void main()
{
int i = 0, j = 0;
//定义一个二维的动态数组,有10行,每一行是一个用一个vector存储这一行的数据。
所以每一行的长度是可以变化的。之所以用到vector(0)是对vector初始化,否则不能对vector存入元素。
vector< vector > Array( 10, vector(0) );
for( j = 0; j < 10; j++ )
{
 for ( i = 0; i < 9; i++ )
 {
  Array[ j ].push_back( i );
 }
}
for( j = 0; j < 10; j++ )
{
 for( i = 0; i < Array[ j ].size(); i++ )
 {
  cout << Array[ j ][ i ] << " ";
 }
 cout<< endl;
}
}

(2)定义一个行列都是变化的数组。

#include
#include
#include 
using namespace std;
void main()
{
int i = 0, j = 0;
vector< vector > Array;
vector< int > line;
for( j = 0; j < 10; j++ )
{
 Array.push_back( line );//要对每一个vector初始化,否则不能存入元素。
 for ( i = 0; i < 9; i++ )
 {
  Array[ j ].push_back( i );
 }
}
for( j = 0; j < 10; j++ )
{
 for( i = 0; i < Array[ j ].size(); i++ )
 {
  cout << Array[ j ][ i ] << " ";
 }
 cout<< endl;
}
}

(3)使用 vettor erase 删除指定元素

#include "iostream"
#include "vector"
using namespace std;
int main()
{
  vector arr;
  arr.push_back(6);
  arr.push_back(8);
  arr.push_back(3);
  arr.push_back(8);
  for(vector::iterator it=arr.begin(); it!=arr.end(); )
  {
    if(* it == 8)
    {
      it = arr.erase(it);
    }
    else
    {
      ++it;
    }
  }
  cout << "After remove 8:n";
  for(vector::iterator it = arr.begin(); it < arr.end(); ++it)
  {
    cout << * it << " ";
  }
  cout << endl;
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/64391.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号