vector 称为容器模板类,是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector 类型的每一种都指定了其保存元素的类型,如vector<int> 和vector<string> 都是数据类型。vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

初始化:

  1. int myarray[5] = {1,3,5,7,9};
  2. vector<int> ivec1(myarray
    , myarray+5);//数组元素值赋值给vector,深拷贝直接赋值
  3. vector<int> ivec2(ivec1);// ok: copy elements of ivec1 into ivec2 ,深拷贝
  4. vector<int> ivec3=ivec2;//ok,深拷贝
  5. vector<string> svec(ivec1);// error: svec holds strings, not ints
  6. vector<int> ivec4(10, -1); // 10 elements, each initialized to -1
  7. vector<string> svec(10, "hi!");// 10 strings, each initialized to "hi!"

如果没有给出元素的初始化式,则标准库生成的初始值用于初始化容器中的每个元素。元素初始化式的值取决于存储在 vector 中元素的数据类型。例如,int初始化为0,string初始化为0

注意:

   ①vector 中的对象是没有命名的,可以按 vector 中对象的位置来访问它们。使用下标索引[]访问,下标从0开始,且下标只能获取已存在的元素

使用size_type 类型时,必须指出该类型是在哪里定义的。如vector<int>::size_type i

  1. for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
  2. ivec[ix] = 0;

迭代器访问对象(推荐)

  1. vector<int>::iterator it;
  2. for(it=vec.begin();it!=vec.end();it++)
  3. cout<<*it<<endl;

1.常用函数列表

      push_back()------新对象插入到末尾
      insert()-------------插入一个元素或多个元素或一个内范围元素至矢量中的指定位置
      pop_back()--------删除末尾元素
      at()------------------返回对指定的索引对象的引用
      front()---------------返回最前面一个数据的引用
      back()---------------传回最后一个数据的引用,故赋值时也应该是同类型的引用类型,若为空返回值不确定。
      begin()--------------Returns a random-access iterator to the first element in the vector.
      end()----------------Returns the past-the-end iterator.
      data()----------------Returns a pointer to the first element in the vector.
      assign()-------------清空vector并复制制定的元素到vector
      erase()--------------删除指定的元素或者制定区间段的元素
      resize()--------------重定义size
      clear()---------------移除容器中所有数据
     empty()--------------判断容器是否为空,为空则为真。
  1. vector<int> v1,v2;
  2. vector<int>::iterator c1_Iter;
  3. v1.push_back(10);
  4. v1.push_back(11);
  5. v1.push_back(12);v1.push_back(13);
  6. v1.push_back(14);
  7. v1.pop_back();
  8. int &a=v1.front();//引用
  9. int &b=v1.back( );//引用
  10. int &c= v1.at(0);//引用
  11. c1_Iter = c1.begin();//迭代器类型
  12. c1_Iter = c1.begin();//返回指向末尾元素的后一个的迭代器
  13. v2.assign(v1.begin(), v1.end());//v2=v1
  14. v2.assign({ 5, 6, 7 });//5,6,7依次push至末尾
  15. v2.assign(4,10);//v2=10 10 10 10
  16. v2.assign(v1.begin()+2, v1.begin()+4)//将v1索引2 3的元素赋给v2</span>
  17. v1.erase( v1.begin( ) );//删除索引0元素
  18. v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );//删除索引1 2 3的元素
  19. v1.resize( 2,40 );
  20. cout << "The size of v1 is " << v1.size( ) << endl;//输出6
  21. cout << "The value of the last object is " << v1.back( ) << endl;//输出40
  22. v1.resize( 10);
  23. cout << "The size of v1 is now " << v1.size( ) << endl;//输出10
  24. cout << "The value of the last object is now " << v1.back( ) << endl;//输出0
  25. v1.insert( v1.begin( ) + 1, 88);//原索引1之前插入88
  26. v1.insert( v1.begin( ) + 2, 4, 50 );//原索引2之前插入4个50
  27. v1.insert( v1.begin( )+1, v1.begin( )+2, v1.begin( )+4 );//将原索引2,3的元素复制插入原索引1之前
  28. vector < vector <int> > vv1;// initialize a vector of vectors by moving v1
  29. vv1.insert( vv1.begin(), move( v1 ) );
  30. if (vv1.size( ) != 0 && vv1[0].size( ) != 0 )
  31. {
  32. vector <int>::iterator Iter;
  33. cout << "vv1[0] =";
  34. for (Iter = vv1[0].begin( ); Iter != vv1[0].end( ); Iter++ )
  35. cout << " " << *Iter;
  36. cout << endl;
  37. }
  38. v1.clear( );//清空vector

2.vector之结构体

vector元素类型还可以是结构体,使用时注意结构体要定义为全局。

  1. #include"stdafx.h"
  2. #include<vector>
  3. #include<iostream>
  4. using namespace std;
  5. typedef struct rect
  6. {
  7. int id;
  8. int length;
  9. int width;
  10. }Rect;
  11. int main()
  12. {
  13. vector<Rect> vec;
  14. Rect rect={1,2,3};
  15. vec.push_back(rect);
  16. vector<Rect>::iterator it=vec.begin();
  17. cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;
  18. return 0;
  19. }

3.vector之string

vector<string>类型的快速初始化和输出

  1. #include"stdafx.h"
  2. #include<iostream>
  3. #include<vector>
  4. #include"string"
  5. using namespace std;
  6. int main()
  7. {
  8. string   str[]={"hello", "world", "CHB","\n"};
  9. vector<string> strArray1(10,"hello");
  10. vector<string> strArray(str,str+sizeof(str)/sizeof(str[0]));
  11. for(vector<string>::iterator iter=strArray.begin();iter!=strArray.end();++iter)
  12. cout<<*iter<<endl;//换行符也被读入
  13. for(vector<string>::size_type i=0;i<strArray1.size();i++)
  14. cout<<strArray1[i]<<endl;;
  15. return 0;
  16. }

4.作为参数或者返回类型

作为参数或者返回类型时。尊崇一般策略。比如,对于main()中的vector,子函数应该使用引用才能改变其值。例如任意数转换为2进制。如下:

#include"iostream"
#include"vector"
using namespace std;
void Convert(vector<int> &ans,int number,int n)
{
if(!number)return;
else
{ans.push_back(number%n);
Convert(ans,number/n,n);}
}
void main()
{
int number=121;
vector<int> ans;
Convert(ans,number,2);
if(!ans.empty())
for(int it=ans.size()-1;it>=0;it--)
cout<<ans[it];
cout<<endl;
}



5.Vector 变量之间的赋值

直接使用赋值符号“=”赋值,构造函数()赋值,或者数组赋值。均为深拷贝,即改变源vector元素的值不会对目标vector造成影响。如下所示;

void main()
{
int myarray[5] = {1,3,5,7,9};
vector<int> v1(myarray , myarray+5);//深拷贝,指向地址不同
vector<int> v2 = v1,v3(v1);//深拷贝,指向地址不同
myarray[0]=10;
cout<<v1[0]<<" ";
v1[2]=11;
cout<<v2[2]<<" ";
cout<<v3[2]<<" "<<endl; string s[3]={"we","love","china"};
vector<string> s1(s,s+3);//深拷贝,指向地址不同
vector<string> s2=s1,s3(s1);//深拷贝,指向地址不同
s[0]="everyone";
cout<<s1[0]<<endl;
s1[2]="Hubei";
cout<<s2[2]<<endl;
cout<<s3[2]<<endl; }

输出为:


6.结合Pair类型的使用

Pair类型概述

pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下:

pair<int, string> a;

表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。直接对其初始化 pair<string, string> a("James", "Joy");

由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:

             typedef pair<string, string> mypair;
mypair pro("May", "Lily");
mypair joye("James", "Joyce");

对于pair类,由于它只有两个元素,分别名为first和second,因此直接使用普通的点操作符即可访问其成员。

可以使用make_pair对已存在的两个数据构造一个新的pair类型:

     int a = 8;
string m = "James";
pair<int, string> newone;
newone = make_pair(a, m);

简单的代码如下:

#include "iostream"
#include"algorithm"
#include"vector"
#include"string"
using namespace std;
bool strict_weak_ordering(const pair<int,std::string> a, const pair<int, std::string>b)
{ return a.first < b.first;}
int main()
{
using namespace std;
vector<pair<int, string> > vec;
vec.push_back(make_pair<int, string>(6, "ABC"));
vec.push_back(make_pair<int, string>(4, "BCD"));
vec.push_back(make_pair<int, string>(7, "EFG"));
sort(vec.begin(), vec.end(), strict_weak_ordering);
for( vector<pair<int, string>>::iterator it =vec.begin(); it !=vec.end(); ++it)
cout<<it->second<<endl;
return 0;
}


7.附加

#include<algorithm>中的泛函算法

搜索算法:find() 、search() 、count() 、find_if() 、search_if() 、count_if() 

   分类排序:sort()、merge() 

   删除算法:unique() 、remove() 

   生成和变异:generate() 、fill() 、transformation() 、copy() 

   关系算法:equal() 、min() 、max()

部分参考自 C++ vector类型要点总结

C++之vector模板类的更多相关文章

  1. Vector模板类----构造与析构

    /* 基于C++平台*/ typedef int rank; //用int来定义 “秩” 这种概念 #define DEFAULT_CAPACIITY 3 //默认初始容量,实际应用中可以取更大的值 ...

  2. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

  3. [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template <  class _Ty,  ...

  4. 实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

  5. 模板类 vector

    概要 介绍一下模板类 vector 的常用操作,以及一个应用举例,顺时针打印矩阵.   基本定义 模板类 vector 是一种动态数组,它是使用 new 创建动态数组的替代品,实际上,vector 也 ...

  6. c++转载系列 std::vector模板库用法介绍

    来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...

  7. [百度空间] [原]DLL导出实例化的模板类

    因为模板是在编译的时候根据模板参数实例化的,实例化之后就像一个普通的类(函数),这样才有对应的二进制代码;否则,没有模板参数,那么编译器就不知道怎么生成代码,所以生成的DLL就没有办法导出模板了.但是 ...

  8. C++中模板函数或模板类中关键词class和typename

    ##区别 基本上来说,class和typename几乎没有区别.在可以使用class的地方都可以使用typename,在使用typename的地方也几乎可以使用class. 可以看出我加黑了两个子:几 ...

  9. 基于ACE的定时器模板类

    ACETimerClockGenerator.h ClockGeneratorIF.h 在类中定义一个结构体,在结构体中定义一个函数. 在结构体中定义一个函数,这样做有什么好呢? TimerHandl ...

随机推荐

  1. vim 光标的移动和跳转文件的位置

    刚启动vim进入的就是命令模式 在命令模式下 h等于左箭头 j等于下箭头 k等于上箭头 l等于右箭头 想要多次移动可以使用30j或30↓向下移动30行 在命令模式下输入0跳到行头 在命令模式下输入$跳 ...

  2. log4j中怎样将信息写入到不同的日志文件

    log4j中怎样将信息写入到不同的日志文件 有没有想过为什么我们用:Logger logger = Logger.getLogger(ABC.class) ;来得到 logger? 不想只看人家的 d ...

  3. Ubuntu下,grep的用法

    grep(Global search Regular Expression and Print out the line)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.U ...

  4. Oracle数据库操作语言(DML)

    --insert添加语句 insert into table_name(column_name,column_name,...) values (data1,data2,...); --通过表添加数据 ...

  5. 造成segmentation fault的可能原因分析

    一 造成segment fault,产生core dump的可能原因 1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串 ...

  6. python中类__call__方法与@classmethod

    实现了__call__方法的类就变成了一个可调用对象,可以像函数一样调用,callable(obj)就返回True,否则返回False. 参考:https://www.cnblogs.com/supe ...

  7. 51nod1428 活动安排问题 (贪心加暴力)

    1428 活动安排问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动 ...

  8. 树套树Day2

    滚回来更新,,, 在Day1我们学了最基本的线段树套平衡树 Day2开始我们要学习一些黑科技 (所以很大概率会出现Day3 w 1.线段树上的黑科技 这一段我们分几项来讲 1.权值线段树 权值线段树以 ...

  9. Spring MVC表单提交

    实际应用中,列表中的单条记录的修改,可能需要传很多对象参数到后台服务器,Spring MVC表单标签<form:> 提供了一种简洁的提交方式. <form id="form ...

  10. ACM学习历程—HDU5521 Meeting(图论)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 学习菊苣的博客,只粘链接,不粘题目描述了. 题目大意就是一个人从1开始走,一个人从n开始走.让最 ...