C++ vector 用法(#include <vector>)

标准库Vector类型

使用需要的头文件:

#include <vector>

Vector:Vector 是一个类模板。不是一种数据类型。 Vector<int>是一种数据类型。

一、  定义和初始化

Vector<T> v1;       //默认构造函数v1为空

Vector<T> v2(v1);//v2是v1的一个副本

Vector<T> v3(n,i);//v3包含n个值为i的元素

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

二、  值初始化

1>     如果没有指定元素初始化式,标准库自行提供一个初始化值进行值初始化。

2>     如果保存的式含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化。

3>     如果保存的式没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。

三、Vector对象最重要的几种操作

1.    v.push_back(t)             在数组的最后添加一个值为t的数据

2.    v.size()                         当前使用数据的大小

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

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

5.    v1=v2                           把v1的元素替换为v2元素的副本

6.    v1==v2                         判断v1与v2是否相等

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

vector容器类型

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

vector的构造

函数原型:

template<typename T>

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<string> v1;         // 创建空容器,其对象类型为string类

vector<string> v2(10);     // 创建有10个具有初始值(即空串)的string类对象的容器

vector<string> v3(5, "hello"); // 创建有5个值为“hello”的string类对象的容器

vector<string> 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()<n,那么用元素x的值补全。

reference front();                     // 返回容器中第一个元素的引用(容器必须非空)

const_reference front() const;

reference back();                      // 返回容器中最后一个元素的引用(容器必须非空)

const_reference back() const;

reference operator[](size_type pos);   // 返回下标为pos的元素的引用(下标从0开始;如果下标不正确,则属于未定义行为。

const_reference operator[](size_type pos) const;

reference at(size_type pos);           // 返回下标为pos的元素的引用;如果下标不正确,则抛出异常out_of_range

const_reference at(size_type pos) const;

void push_back(const T& x);            // 向容器末尾添加一个元素

void pop_back();                       // 弹出容器中最后一个元素(容器必须非空)

// 注:下面的插入和删除操作将发生元素的移动(为了保持连续存储的性质),所以之前的迭代器可能失效

iterator insert(iterator it, const T& x = T());        // 在插入点元素之前插入元素(或者说在插入点插入元素)

void insert(iterator it, size_type n, const T& x);     // 注意迭代器可能不再有效(可能重新分配空间)

void insert(iterator it, const_iterator first, const_iterator last);

iterator erase(iterator it);           // 删除指定元素,并返回删除元素后一个元素的位置(如果无元素,返回end())

iterator erase(iterator first, iterator last); // 注意:删除元素后,删除点之后的元素对应的迭代器不再有效。

void clear() const;                    // 清空容器,相当于调用erase( begin(), end())

void assign(size_type n, const T& x = T());   // 赋值,用指定元素序列替换容器内所有元素

void assign(const_iterator first, const_iterator last);

const_iterator begin() const;          // 迭代序列

iterator begin();

const_iterator end() const;

iterator end();

const_reverse_iterator rbegin() const;

reverse_iterator rbegin();

const_reverse_iterator rend() const;

reverse_iterator rend();

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类型)。

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

应用示例

#include <iostream>

#include <cassert>

#include <vector>

using namespace std;

int main()

{

vector<string> v(5, "hello");

vector<string> v2(v.begin(), v.end());

assert(v == v2);

cout<<"> Before operation"<<endl;

for(vector<string>::const_iterator it = v.begin(); it < v.end(); ++it)

cout<<*it<<endl;

v.insert(v.begin() + 3, 4, "hello, world");

cout<<"> After insert"<<endl;

for(vector<string>::size_type i = 0; i < v.size(); ++i)

cout<<v[i]<<endl;

vector<string>::iterator it = v.erase(v.begin() + 3, v.begin() + 6);

assert(*it == "hello, world");

cout<<"> After erase"<<endl;

for(vector<string>::size_type i = 0; i != v.size(); ++i)

cout<<v[i]<<endl;

assert(v.begin() + v.size() == v.end());

assert(v.end() - v.size() == v.begin());

assert(v.begin() - v.end() == -vector<string>::difference_type(v.size()));

return 0;

}

程序说明:上面程序中用了三个循环输出容器中的元素,每个循环的遍历方式是不一样的。特别需要说明的是,第二个循环在条件判断中使用了size()
函数,而不是在循环之前先保存在变量中再使用。之所以这样做,有两个原因:其一,如果将来在修改程序时,在循环中修改了容器元素个数,这个循环仍然能很好
地工作,而如果先保存size()函数值就不正确了;其二,由于这些小函数(其实现只需要一条返回语句)基本上都被声明为inline,所以不需要考虑效
率问题。

---------------------------------

c++编程语言中有一种叫做Vector的应用方法,它的作用在实际编程中是非常重要的。在这里我们将会为大家详细介绍一下C++ Vector的相关应用技巧及基本内容,希望能给大家带来一些帮助。

(1)vector< 类型 > 标识符 ;

(2)vector< 类型 > 标识符(最大容量) ;

(3)vector< 类型 > 标识符(最大容量,初始所有值);

(4) int i[4] = {12,3,4,5};

vector< 类型 > vi(i , i+2); //得到i索引值为3以后的值 ;

(5)vector< vector<int> > //vi 定义2维的容器;记得一定要有空格,不然会报错

vector< int > line   // 在使用的时候一定要首先将vi个行进行初始化;   for(int i = 0 ; i < 10 ; i ++)  {  vector.push_back(line);  }  /// 个人认为使用vector定义二维数组很好,
因为是长度可以不预先确定。很好。

(6)C++ Vector排序

vector< int > vi ;

vi.push_back(1);

vi.push_back(3);

vi.push_back(0);

sort(vi.begin() , vi.end()); /// /小到大

reverse(vi.begin(),vi.end()) /// 从大道小

(7)顺序访问

vector < int > vi ;

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

{

vector.push_back(i);

}

for(int i = 0 ; i < 10 ; i ++) /// 第一种调用方法

{

cout <<vector[i] <<" " ;

}

for(vector<int>::iterator it = vi.begin() ; it !=vi.end() ; it++) ///第二种调用方法

{

cout << *it << " " ;

}

(8)寻找

vector < int > vi ;

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

{

vector.push_back(i);

}

vector < int >::interator it = find(vi.begin() , vi.end,3) ;

cout << *it << endl ; ///返回容器内找到值的位置。

(9)使用数组对C++ Vector进行初始化

int i[10] ={1,2,3,4,5,6,7,78,8} ;  ///第一种

vector<int> vi(i+1,i+3); ///从第2个元素到第三个元素

for(vector <int>::interator it = vi.begin() ; it != vi.end() ; it++)

{

cout << *it <<" " ;

}

(10) 结构体类型

struct temp  {

public :  string str ;

public :  int id ;

}tmp

int main()  {

vector <temp> t ;

temp w1 ;

w1.str = "Hellowor" ;

w1.id = 1 ;   t.push_back(t1);

cout << w1.str << "," <<w1.id <<endl ;

return 0 ;

}

最新文章

  1. linux安装nexus
  2. 关于ASP.NET或VS2005 搭建三层架构的理解
  3. Android系列---JSON数据解析
  4. windows无法搜索新更新 80072ee2
  5. CSS3中渐变gradient详解
  6. TCP回射服务器程序:str_echo函数
  7. mysql如何直接查出从1开始递增的数
  8. C# CefSharp MemoryStreamResponseFilter这个类使用过程中遇到的bug,dataIn.CopyTo(dataOut)异常
  9. tensorflow 曲线拟合
  10. iOS 自己封装的网络请求,json解析的类
  11. Win7 安装 MongoDB
  12. python unittest 1
  13. 区分IE8/IE7/IE6及其他浏览器-CSS “\9″
  14. Spring Boot 运作原理
  15. 【mlflow】打包:npm run build + python setup.py sdist
  16. SparkGraphx计算指定节点的N度关系节点
  17. shell的奇淫巧技--自动化脚本(sed命令)
  18. NativeXml: A native Delphi XML parser and writer
  19. MySQL的索引实现原理
  20. BZOJ 5421: 收藏家

热门文章

  1. vim指令
  2. WebAPI MVC Change Identity Default Table
  3. codeforces611C
  4. 安卓Android基础第三天——数据库,ListView
  5. Spring模块介绍
  6. Hibernate查询以及优化策略04
  7. Codeforces510 D. Fox And Jumping
  8. 【XSY1642】Another Boring Problem 树上莫队
  9. Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) A - D2
  10. hiho1249 Xiongnu&#39;s Land