C++中vector容器的常用操作方法实例总结

1 获得容器最后一个元素 

------ 使用 back或rbegin 取得

// back、rbegin 有常量和引用两种形式
    std::vector<int> myVector;
    myVector.back()=3; 

    std::vector<int>::reverse_iterator tailIter;
    tailIter=myVector.rbegin();
    *tailIter=3

2 删除某元素
需要删除某位置的元素,应使用iterator遍历, 不应使用at(i) 方式遍历,因为删除元素时,是根据iterator位置进行删除的。
删除元素时,返回值为:位于删除的元素之后的第一个的元素所在的位置

#include <vector>
#include <iostream> 

int main( )
{
  using namespace std;
  vector <int> v1;
  vector <int>::iterator Iter; 

  v1.push_back( 10 );
  v1.push_back( 20 );
  v1.push_back( 30 );
  v1.push_back( 40 );
  v1.push_back( 50 ); 

  cout << "v1 =" ;
  for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
   cout << " " << *Iter;
  cout << endl; 

  v1.erase( v1.begin( ) );
  cout << "v1 =";
  for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
   cout << " " << *Iter;
  cout << endl; 

  v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );
  cout << "v1 =";
  for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
   cout << " " << *Iter;
  cout << endl;
}

输出:

v1 = 10 20 30 40 50
v1 = 20 30 40 50
v1 = 20 50

3  两vector 容易赋值时,不能通过=来赋值
而应使用遍历 或assign函数的方式来赋值

//delNode.vectorNode 是与delPositionVector同类型容器
// vector 两容器不能直接赋值 可通过 遍历每个元素赋值,也可使用 assign赋值 

VectorNode delNode; 

delNode.numberOfFenkuai=nSelect;
Node nodeTemp;

错误赋值方式:

// 这是错误的赋值方式
  delNode.vectorNode=delPositionVector ;

正确赋值方式一: 遍历

for (int i=0;i<delPositionVector.size();i++)
{
  nodeTemp=delPositionVector.at(i);
  delNode.vectorNode.push_back(nodeTemp);
} 

正确赋值方式二: assign函数

delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end());

4  在指定的iterator位置 插入容器元素
插入某元素时,返回值为插入的那个元素所在的位置,原先处于此位置的元素将被顺次后移

iterator insert(
  iterator _Where,
  const Type& _Val
);
void insert(
  iterator _Where,
  size_type _Count,
  const Type& _Val
);
template<class InputIterator>
   void insert(
   iterator _Where,
   InputIterator _First,
   InputIterator _Last
  );

5 更新容器中的某个元素
办法之一:  先搜索到这个元素位置, 在此位置添加更新的元素,删除原先的元素
                       或搜索到此元素,删除此元素,在此元素位置上添加新元素
应用例子:

delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end());
BOOL bInsert=FALSE;
std::vector <VectorNode>::iterator iter;
for (iter=g_DelVector.begin();iter!=g_DelVector.end();iter++)
{
  if ((*iter).numberOfFenkuai==nSelect)
  {
    bInsert=TRUE;
    //g_DelVector.erase(iter);
    //g_DelVector.insert(iter,delNode);
    iter=g_DelVector.insert(iter,delNode);
    iter=g_DelVector.erase(iter+1);
    iter--;
    break;
  }
} 

if (!bInsert)
{
  g_DelVector.push_back(delNode);
}

6 push_back或pop某元素后,迭代器会失效  需要重新获得

STL中的vector不是关联性容器,当插入新的元素后,原来取得的迭代器就会失效。

std::vector<int> vNum;
vNum.push_back(1);
vNum.push_back(3);
vNum.push_back(5);
std::vector<int>::iterator pIt = vNum.begin();
std::cout << "Before insert a new number: " << *pIt << std::endl;
vNum.push_back(7);
std::cout << "After insert a new number: " << *pIt << std::endl;  // Oh! No!

注意最后一句,运行到最后一句时就会发生崩溃,迭代器访问错误。插入元素后,要重新取得迭代器。

而对于map这样的关联性容器,插入新元素后,原来的迭代器仍然会有效。
例子如下:

std::map<int, int> mNum;
mNum[0] = 0;
mNum[1] = 1;
mNum[2] = 2;
std::map<int, int>::iterator pIt = mNum.begin();
std::cout << "Before insert a new number: (" << pIt->first << ", " << pIt->second << ")" << std::endl;
mNum[3] = 3;
std::cout << "After insert a new number: (" << pIt->first << ", " << pIt->second << ")" << std::endl; // OK!

7 合并两个顺序容器

std::vector<line>::iterator i1 = v1.begin(), i2 = v2.begin();
while(i1 != v1.end() && i2 != v2.end())
{
  if(i1->index == i2->index)
  {
    line t = { i1->index, i1->value1, i2->value2 }
    v3.push_back(t);
    ++i1;
    ++i2;
  }
  else if(i1->index > i2->index)
  {
    i2->value1 = 0;
    v3.push_back(*i2);
    ++i2;
  }
  else
  {
    i1->value2 = 0;
    v3.push_back(*i1);
    ++i1;
  }
} 

while(i1 != v1.end())
  v3.push_back(*(i1++)); 

while(i2 != v2.end())
  v3.push_back(*(i2++));

9 排序

// alg_sort.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>   // For greater<int>( )
#include <iostream> 

// Return whether first element is greater than the second
bool UDgreater ( int elem1, int elem2 )
{
  return elem1 > elem2;
} 

int main( )
{
  using namespace std;
  vector <int> v1;
  vector <int>::iterator Iter1; 

  int i;
  for ( i = 0 ; i <= 5 ; i++ )
  {
   v1.push_back( 2 * i );
  } 

  int ii;
  for ( ii = 0 ; ii <= 5 ; ii++ )
  {
   v1.push_back( 2 * ii + 1 );
  } 

  cout << "Original vector v1 = ( " ;
  for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
   cout << *Iter1 << " ";
  cout << ")" << endl; 

  sort( v1.begin( ), v1.end( ) );
  cout << "Sorted vector v1 = ( " ;
  for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
   cout << *Iter1 << " ";
  cout << ")" << endl; 

  // To sort in descending order. specify binary predicate
  sort( v1.begin( ), v1.end( ), greater<int>( ) );
  cout << "Resorted (greater) vector v1 = ( " ;
  for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
   cout << *Iter1 << " ";
  cout << ")" << endl; 

  // A user-defined (UD) binary predicate can also be used
  sort( v1.begin( ), v1.end( ), UDgreater );
  cout << "Resorted (UDgreater) vector v1 = ( " ;
  for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
   cout << *Iter1 << " ";
  cout << ")" << endl;
}
Original vector v1 = ( 0 2 4 6 8 10 1 3 5 7 9 11 )
Sorted vector v1 = ( 0 1 2 3 4 5 6 7 8 9 10 11 )
Resorted (greater) vector v1 = ( 11 10 9 8 7 6 5 4 3 2 1 0 )
Resorted (UDgreater) vector v1 = ( 11 10 9 8 7 6 5 4 3 2 1 0 )

10  清空所有元素

m_itemVector.clear();

11 遍历

vector<ITEM_CHECK>::iterator iter=m_itemVector.begin();
for(i=0;iter!=m_itemVector.end();iter++,i++)
{
  if(iter->flag==-1)
  {
    break;
  }
  iter->flag=1;
} 

vector<ITEM_CHECK>::iterator iter=m_itemVector.begin();
for(i=0;iter!=m_itemVector.end();iter++,i++) //先全部取消
{
  iter->flag=0;
}

12 删除符合条件的项

int CurrentCount=(int)m_itemVector.size();
for(int i=0;i<CurrentCount;i++)
{
  if(m_itemVector.at(i).flag==1)
  {
    m_itemVector.erase(m_itemVector.begin()+i);
    DeleteItem(i);
    this->Invalidate();  

    CurrentCount--;
    i--;                        //删除第i位置后,需要重新判断第i位置是否符合条件,因此需要i--。
  }
}

13 正序遍历 然后反序遍历

vector<ITEM_CHECK>::iterator iter=m_itemVector.begin();
for(i=0;iter!=m_itemVector.end();iter++,i++) //先全部取消
{
  iter->flag=0;
} 

for (;i>0;)            //从后往前设置 iter 退到Begin() 再减的话 就会出现问题
{ 

  iter--; //结束时,正好退到Begin()
  i--;
  iter->flag=1;
} 

14 在VECTOR中查找

#include<vector>
#include<algorithm> //在VECTOR中查找
using namespace std; 

vector<int> L;
L.push_back( 1 );
L.push_back( 2 );
L.push_back( 3 );
L.push_back( 4 );
L.push_back( 5 );
vector<int>::iterator result = find( L.begin( ), L.end( ), 3 ); //查找3
if ( result == L.end( ) ) //没找到
  cout << "No" << endl;
else //找到
  cout << "Yes" << endl;
(0)

相关推荐

  • C++ vector删除符合条件的元素示例分享

    C++ vector中实际删除元素使用的是容器vecrot std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的替换. 1.std::vector::erase() 函数原型:iterator erase (iterator position);//删除指定元素 iterator erase (iterator first, iterator last);//删除指定范围内的元素 返回值:指向删除元素(或范围

  • c++中vector&lt;int&gt;和vector&lt;int*&gt;的用法区别

    在使用STL容器(比如map.list.vector等)的时候,是用放一个对象还是放一个对象指针,即是用vector<int>还是vector<int*>,这里的vector可以换成其他的容器,int可以换成其他基本类型,也可以自定义的数据结构或类. 首先,要说明的是,这两种方式,怎么用都可以实现功能,把一组整型数放到容器里.先看看两种方式在使用的时候的区别. 1.vector<int> 复制代码 代码如下: vector<int> vecTemp;for

  • C++从文本文件读取数据到vector中的方法

    前言 大家应该都只奥vector(向量)是 C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.这篇文章介绍的是C++从文本文件读取数据到vector中的方法,下面话不多说,直接来看示例代码吧. 如题,要将如下文本文件读进vector中 示例代码如下 #include <iostream> using namespace std; #include <cmath> #include

  • C++中vector的用法实例解析

    本文实例展示了C++中的vector用法,分享给大家供大家参考.具体如下: 一.概述 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小. 例如: // c语言风格 int myHouse[100] ; // 采用vector vector<int> vecMyHouse(100); 当如上定义后,vecMyHouse

  • C++ 中Vector常用基本操作

    标准库vector类型是C++中使用较多的一种类模板,vector类型相当于一种动态的容器,在vector中主要有一些基本的操作,下面通过本文给大家介绍,具体内容如下所示: (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的. (5)使用迭代器访问元素. vect

  • C++ vector的用法小结

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

  • 深入理解C++中的vector类的用法及特性

    //<vector> template < class T, class Alloc = allocator<T> > class vector; 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能够存放任意类型的动态数组. vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为

  • 详解C++中的vector容器及用迭代器访问vector的方法

    vector vector是相同类型对象的集合.集合中的每个对象有个对应的索引.vector常被称为容器(container). 为了使用vector,需要: #include <vector> using std::vector; vector是一个类模版(class template).C++有函数模版和类模版.模版本身不是函数或类,必须通过指定 类型让编译器去实例化(instantiation)它.比如vector<int> ivec. vector是模版,不是类型.从vec

  • c++ vector(向量)使用方法详解(顺序访问vector的多种方式)

    vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器.vector 是C++ STL的一个重要成员,使用它时需要包含头文件: 复制代码 代码如下: #include<vector>; 一.vector 的初始化:可以有五种方式,举例说明如下: (1) vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的.(2)vector<int> a(10,

  • C++中vector容器的常用操作方法实例总结

    1 获得容器最后一个元素  ------ 使用 back或rbegin 取得 // back.rbegin 有常量和引用两种形式 std::vector<int> myVector; myVector.back()=3; std::vector<int>::reverse_iterator tailIter; tailIter=myVector.rbegin(); *tailIter=3 2 删除某元素 需要删除某位置的元素,应使用iterator遍历, 不应使用at(i) 方式遍

  • C++中vector容器使用详细说明

    在c++中,vector是一个十分有用的容器,下面通过本文给大家介绍C++中vector容器使用详细说明,具体介绍如下所示 1. 在C++中的详细说明 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库. vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. 2. 使用vector,必须在你的头文件中包含下面的代码: #include vec

  • C++中vector容器的用法

    在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的. (5)使用迭代器访问元素. vector<int>::iterator it; for(it=vec.begi

  • C++中vector容器的注意事项总结

    目录 容量(capacity)和大小(size)的区别 容器扩容的本质 emplace_back()和push_back()的区别 emplace()和insert()的区别 附:如果vector是空的,并且没有分配空间,切忌用下标进行访问,会出错!!! 总结 容量(capacity)和大小(size)的区别 vector 容器的容量(用 capacity 表示),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数:而 vector 容器的大小(用 size 表示),指的是它实际所包含的

  • python中字典dict常用操作方法实例总结

    本文实例总结了python中字典dict常用操作方法.分享给大家供大家参考.具体如下: 下面的python代码展示python中字典的常用操作,字典在python开发中有着举足轻重的地位,掌握字典操作相当重要 #创建一空字典 x = {} #创建包含三个项目的字典 x = {"one":1, "two":2, "three":3} #访问其中的一个元素 x['two'] #返回字典中的所有键列表 x.keys() #返回字典中的所有值列表 x.v

  • 关于STL中vector容器的一些总结

    1.vector的简单介绍 vector作为STL提供的标准容器之一,是经常要使用的,有很重要的地位,并且使用起来也是灰常方便.vector又被称为向量,vector可以形象的描述为长度可以动态改变的数组,功能和数组较为相似.实际上更专业的描述为:vector是一个多功能的,能够操作多种数据结构和算法的模板类和函数库,vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.(注:STL的容器从实现的

  • JS字符串常用操作方法实例小结

    本文实例讲述了JS字符串常用操作方法.分享给大家供大家参考,具体如下: [String类型] 1.返回给定位置的那个字符 var stringValue = "hello world"; alert(stringValue.charAt(1)); //"e" //如果你想得到是不是字符而是字符编码 var stringValue = "hello world"; alert(stringValue.charCodeAt(1)); //输出&quo

  • C++ STL中vector容器的使用

    目录 一.vector (1)区分size()和capacity() (2)迭代器失效 (3)区分const_iterator和constiterator (4)区分reserve()和resize() (5)push_back和emplace (6)关于原位构造(定位new+完美转发) 总结 一.vector (1)区分size()和capacity() size():返回容纳的元素个数 capacity():返回当前分配存储的容量 (2)迭代器失效 (3)区分const_iterator和c

  • JavaScript中各种引用类型的常用操作方法小结

    Object类型 Array类型 重排序方法: compare 升序: function compare(value1, value2){ if (value1<value2){ return -1; } if (value1>value2){ return 1; } else{ return 0; } } var values = [0,1,5,10,15]; values.sort(compare); console.log(values); // [0,1,5,10,15] 降序: fu

  • Objective-C中字符串NSString的常用操作方法总结

    1.创建字符串 (1)常量字符串 复制代码 代码如下: NSString *string = @"i am an iOSDevTip!"; (2)常用创建方法 复制代码 代码如下: NSString *string = [[NSString alloc] init]; string = @"i am an iOSDevTip too!"; (3)用initWithString创建字符串 复制代码 代码如下: NSString *string = [[NSString

随机推荐