vector容器

原文链接:点击打开链接

1 获得容器最后一个元素  ------ 使用 back或rbegin 取得

 

[cpp]  view plain  copy
  1. //  back、rbegin 有常量和引用两种形式  
  2.         std::vector<int> myVector;  
  3.         myVector.back()=3;  
  4.   
  5.   
  6.   
  7.         std::vector<int>::reverse_iterator tailIter;  
  8.         tailIter=myVector.rbegin();  
  9.         *tailIter=3  

 

2 删除某元素 

   需要删除某位置的元素,应使用iterator遍历, 不应使用at(i) 方式遍历,因为删除元素时,是根据iterator位置进行删除的。

   删除元素时,返回值为:位于删除的元素之后的第一个的元素所在的位置

 

 

MSDN解释:

Removes an element or a range of elements in a vector from specified positions.

 
iterator erase(
   iterator _Where
);
iterator erase(
   iterator _First,
   iterator _Last
);

 

Position of the element to be removed from the vector.

_First

Position of the first element removed from the vector.

_Last

Position just beyond the last element removed from the vector.

An iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists.

 

MSDN示例:

[cpp]  view plain  copy
  1. #include <vector>  
  2. #include <iostream>  
  3.   
  4. int main( )  
  5. {  
  6.    using namespace std;     
  7.    vector <int> v1;  
  8.    vector <int>::iterator Iter;  
  9.      
  10.    v1.push_back( 10 );  
  11.    v1.push_back( 20 );  
  12.    v1.push_back( 30 );  
  13.    v1.push_back( 40 );  
  14.    v1.push_back( 50 );  
  15.   
  16.    cout << "v1 =" ;  
  17.    for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )  
  18.       cout << " " << *Iter;  
  19.    cout << endl;  
  20.   
  21.    v1.erase( v1.begin( ) );  
  22.    cout << "v1 =";  
  23.    for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )  
  24.       cout << " " << *Iter;  
  25.    cout << endl;  
  26.   
  27.    v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );  
  28.    cout << "v1 =";  
  29.    for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )  
  30.       cout << " " << *Iter;  
  31.    cout << endl;  
  32. }  


 

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

 

 

 

 

3  两vector 容易赋值时,不能通过=来赋值

而应使用遍历 或assign函数的方式来赋值

 

[cpp]  view plain  copy
  1.    //delNode.vectorNode 是与delPositionVector同类型容器  
  2. // vector 两容器不能直接赋值  可通过 遍历每个元素赋值,也可使用 assign赋值  
  3.   
  4. VectorNode delNode;  
  5.   
  6. delNode.numberOfFenkuai=nSelect;  
  7. Node nodeTemp;  


 

错误赋值方式:

[cpp]  view plain  copy
  1. // 这是错误的赋值方式  
  2.     delNode.vectorNode=delPositionVector ;  


正确赋值方式一: 遍历

 

[cpp]  view plain  copy
  1. for (int i=0;i<delPositionVector.size();i++)  
  2. {  
  3.     nodeTemp=delPositionVector.at(i);  
  4.     delNode.vectorNode.push_back(nodeTemp);  
  5. }  


 

正确赋值方式二: assign函数

 

[cpp]  view plain  copy
  1. delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end());  


 

MSDN 示例:

[cpp]  view plain  copy
  1. #include <vector>  
  2. #include <iostream>  
  3.   
  4. int main( )  
  5. {  
  6.    using namespace std;  
  7.    vector<int> v1, v2, v3;  
  8.    vector<int>::iterator iter;  
  9.   
  10.    v1.push_back(10);  
  11.    v1.push_back(20);  
  12.    v1.push_back(30);  
  13.    v1.push_back(40);  
  14.    v1.push_back(50);  
  15.   
  16.    cout << "v1 = " ;  
  17.    for (iter = v1.begin(); iter != v1.end(); iter++)  
  18.       cout << *iter << " ";  
  19.    cout << endl;  
  20.   
  21.    v2.assign(v1.begin(), v1.end());  
  22.    cout << "v2 = ";  
  23.    for (iter = v2.begin(); iter != v2.end(); iter++)  
  24.       cout << *iter << " ";  
  25.    cout << endl;  
  26.   
  27.    v3.assign(7, 4) ;  
  28.    cout << "v3 = ";  
  29.    for (iter = v3.begin(); iter != v3.end(); iter++)  
  30.       cout << *iter << " ";  
  31.    cout << endl;  
  32. }  
  33.    
  34.   
  35. Output  
  36.     
  37. v1 = 10 20 30 40 50   
  38. v2 = 10 20 30 40 50   
  39. v3 = 4 4 4 4 4 4 4   
  40.    


 

4  在指定的iterator位置 插入容器元素

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

 

MSDN: 解释及示例

 
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
   );

 
_Where

The position in the vector where the first element is inserted.

_Val

The value of the element being inserted into the vector.

_Count

The number of elements being inserted into the vector.

_First

The position of the first element in the range of elements to be copied.

_Last

The position of the first element beyond the range of elements to be copied.

The first insert function returns an iterator that points to the position where the new element was inserted into the vector.

Any insertion operation can be expensive, see vector Class for a discussion ofvector performance.

5 更新容器中的某个元素

 办法之一:  先搜索到这个元素位置, 在此位置添加更新的元素,删除原先的元素

                       或搜索到此元素,删除此元素,在此元素位置上添加新元素

应用例子:

[cpp]  view plain  copy
  1. delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end());  
  2.   
  3.   
  4. BOOL bInsert=FALSE;  
  5. std::vector <VectorNode>::iterator iter;  
  6. for (iter=g_DelVector.begin();iter!=g_DelVector.end();iter++)  
  7. {  
  8.     if ((*iter).numberOfFenkuai==nSelect)  
  9.     {  
  10.         bInsert=TRUE;  
  11.         //g_DelVector.erase(iter);  
  12.         //g_DelVector.insert(iter,delNode);  
  13.         iter=g_DelVector.insert(iter,delNode);  
  14.         iter=g_DelVector.erase(iter+1);  
  15.         iter--;  
  16.         break;  
  17.     }  
  18. }  
  19.   
  20.   
  21. if (!bInsert)  
  22. {  
  23.     g_DelVector.push_back(delNode);  
  24. }  


 

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

 

CSDN 论坛中例子:

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


例子如下:

[cpp]  view plain  copy
  1. std::vector<int> vNum;  
  2. vNum.push_back(1);  
  3. vNum.push_back(3);  
  4. vNum.push_back(5);  
  5. std::vector<int>::iterator pIt = vNum.begin();  
  6. std::cout << "Before insert a new number: " << *pIt << std::endl;  
  7. vNum.push_back(7);  
  8. std::cout << "After insert a new number: " << *pIt << std::endl;    // Oh! No!  


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

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

[cpp]  view plain  copy
  1. std::map<intint> mNum;  
  2. mNum[0] = 0;  
  3. mNum[1] = 1;  
  4. mNum[2] = 2;  
  5. std::map<intint>::iterator pIt = mNum.begin();  
  6. std::cout << "Before insert a new number: (" << pIt->first << ", " << pIt->second << ")" << std::endl;  
  7. mNum[3] = 3;  
  8. std::cout << "After insert a new number: (" << pIt->first << ", " << pIt->second << ")" << std::endl; // OK!  


 

 

7 合并两个顺序容器 

 

[cpp]  view plain  copy
  1. std::vector<line>::iterator i1 = v1.begin(), i2 = v2.begin();  
  2. while(i1 != v1.end() && i2 != v2.end())  
  3. {  
  4.     if(i1->index == i2->index)  
  5.     {  
  6.         line t = { i1->index, i1->value1, i2->value2 }  
  7.         v3.push_back(t);  
  8.         ++i1;  
  9.         ++i2;  
  10.     }  
  11.     else if(i1->index > i2->index)  
  12.     {  
  13.         i2->value1 = 0;  
  14.         v3.push_back(*i2);  
  15.         ++i2;  
  16.     }  
  17.     else  
  18.     {  
  19.         i1->value2 = 0;  
  20.         v3.push_back(*i1);  
  21.         ++i1;  
  22.     }  
  23. }  
  24.   
  25. while(i1 != v1.end())  
  26.     v3.push_back(*(i1++));  
  27.   
  28. while(i2 != v2.end())  
  29.     v3.push_back(*(i2++));  

 

自己的例子:

[cpp]  view plain  copy
  1. // 删除线  
  2. std::vector<Node>  delPosition;  
  3.   
  4. for (int i=0;i<g_DelVector.size();i++)  
  5. {  
  6.     if (g_DelVector.at(i).numberOfFenkuai==nSelect)  
  7.     {  
  8.         delPosition.assign(g_DelVector.at(i).vectorNode.begin(),g_DelVector.at(i).vectorNode.end());  
  9.         break;  
  10.     }  
  11. }  
  12.   
  13.   
  14. //  设置 underLine 下划线  
  15. std::vector<Node>  underLinePosition;  
  16.   
  17. for (int i=0;i<g_underLineVector.size();i++)  
  18. {  
  19.     if (g_underLineVector.at(i).numberOfFenkuai==nSelect)  
  20.     {  
  21.         underLinePosition.assign(g_underLineVector.at(i).vectorNode.begin(),g_underLineVector.at(i).vectorNode.end());  
  22.         break;  
  23.     }  
  24. }  
  25.   
  26.   
  27. // 合并删除线 和 下划线 位置  
  28. Node node;  
  29. std::vector<Node> erasePosition;  
  30. std::vector<Node>::iterator i1=delPosition.begin(),i2=underLinePosition.begin();  
  31.   
  32. while (i1!=delPosition.end()&&i2!=underLinePosition.end())  
  33. {  
  34.     if (i1->nStart==i2->nEnd) // 合并  同时前进++  
  35.     {  
  36.         node.nStart=i2->nStart;  
  37.         node.nEnd=i1->nEnd;  
  38.         i1++;  
  39.         i2++;  
  40.   
  41.         erasePosition.push_back(node);  
  42.         continue;  
  43.     }  
  44.   
  45.     if (i1->nEnd==i2->nStart)  
  46.     {  
  47.         node.nStart=i1->nStart;  
  48.         node.nEnd=i2->nEnd;  
  49.         i1++;  
  50.         i2++;  
  51.         erasePosition.push_back(node);  
  52.         continue;  
  53.     }  
  54.   
  55.   
  56.     if (i1->nEnd<i2->nStart)  
  57.     {  
  58.         node=*i1;  
  59.         i1++;  
  60.         erasePosition.push_back(node);  
  61.         continue;  
  62.     }  
  63.   
  64.     if (i1->nStart>i2->nEnd)  
  65.     {  
  66.         node=*i2;  
  67.         i2++;  
  68.         erasePosition.push_back(node);  
  69.         continue;  
  70.     }  
  71. }  
  72.   
  73.   
  74. while(i1!=delPosition.end())  
  75.     erasePosition.push_back(*(i1++));  
  76.   
  77.   
  78. while(i2!=underLinePosition.end())  
  79.     erasePosition.push_back(*(i2++));  
  80.   
  81.   
  82. /  整理erasePositon, 使得首尾相连的地方 进行合并  
  83.   
  84. std::vector<Node>::iterator iter1,iter2;  
  85. for (iter1=erasePosition.begin();iter1!=erasePosition.end();)  
  86. {  
  87.     iter2=iter1+1;  
  88.     if (iter2!=erasePosition.end())  
  89.     {  
  90.         if (iter1->nEnd==iter2->nStart)  
  91.         {  
  92.             iter1->nEnd=iter2->nEnd;  
  93.             iter1=erasePosition.erase(iter2);  
  94.             iter1--;  
  95.             continue;  
  96.         }  
  97.             
  98.     }  
  99.       
  100.     iter1++;  
  101. }  
  102.   
  103.   
  104. trueString=_T("");  
  105. CString mixString;  
  106. GetRichEditCtrl().GetWindowText(mixString);  
  107.   
  108. int nStart=0;  
  109. for (iter1=erasePosition.begin();iter1!=erasePosition.end();iter1++)  
  110. {  
  111.     trueString+=mixString.Mid(nStart,iter1->nStart-nStart);  
  112.     nStart=iter1->nEnd;  
  113. }  
  114.   
  115. trueString+=mixString.Mid(nStart);  


 

 

8  创建全局VECTOR变量,其元素仍为VECTOR类型 ---- 相当于二维数组  

 

stdafx.h

定义数据结构,及声明变量

 

[cpp]  view plain  copy
  1. //-------------struct 定义的是结构  不是变量  所以不能在其前 加  extern  
  2. struct Node{  
  3.   
  4.     int nStart;  
  5.     int nEnd;  
  6. };  
  7.   
  8.   
  9.  struct VectorNode{  
  10.   
  11.     std::vector<Node> vectorNode;  
  12.     int  numberOfFenkuai;// 分块号  
  13. };  
  14.   
  15.   
  16. extern std::vector <VectorNode>   g_DelVector;   //  声明的是变量  ,可以加extern  表示全局变量  
  17. extern std::vector <VectorNode> g_AddVector;  


stdafx.cpp  为.H中所声明的变量进行定义

 

[cpp]  view plain  copy
  1. #include "stdafx.h"  
  2.   
  3.   
  4.  std::vector <VectorNode>   g_DelVector;  
  5.  std::vector <VectorNode> g_AddVector;  


 

 

9 排序

[cpp]  view plain  copy
  1. // alg_sort.cpp  
  2. // compile with: /EHsc  
  3. #include <vector>  
  4. #include <algorithm>  
  5. #include <functional>      // For greater<int>( )  
  6. #include <iostream>  
  7.   
  8. // Return whether first element is greater than the second  
  9. bool UDgreater ( int elem1, int elem2 )  
  10. {  
  11.    return elem1 > elem2;  
  12. }  
  13.   
  14. int main( )  
  15. {  
  16.    using namespace std;  
  17.    vector <int> v1;  
  18.    vector <int>::iterator Iter1;  
  19.   
  20.    int i;  
  21.    for ( i = 0 ; i <= 5 ; i++ )  
  22.    {  
  23.       v1.push_back( 2 * i );  
  24.    }  
  25.   
  26.    int ii;  
  27.    for ( ii = 0 ; ii <= 5 ; ii++ )  
  28.    {  
  29.       v1.push_back( 2 * ii + 1 );  
  30.    }  
  31.   
  32.    cout << "Original vector v1 = ( " ;  
  33.    for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )  
  34.       cout << *Iter1 << " ";  
  35.    cout << ")" << endl;  
  36.   
  37.    sort( v1.begin( ), v1.end( ) );  
  38.    cout << "Sorted vector v1 = ( " ;  
  39.    for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )  
  40.       cout << *Iter1 << " ";  
  41.    cout << ")" << endl;  
  42.   
  43.    // To sort in descending order. specify binary predicate  
  44.    sort( v1.begin( ), v1.end( ), greater<int>( ) );  
  45.    cout << "Resorted (greater) vector v1 = ( " ;  
  46.    for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )  
  47.       cout << *Iter1 << " ";  
  48.    cout << ")" << endl;  
  49.   
  50.    // A user-defined (UD) binary predicate can also be used  
  51.    sort( v1.begin( ), v1.end( ), UDgreater );  
  52.    cout << "Resorted (UDgreater) vector v1 = ( " ;  
  53.    for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )  
  54.       cout << *Iter1 << " ";  
  55.    cout << ")" << endl;  
  56. }  


 

[cpp]  view plain  copy
  1. Original vector v1 = ( 0 2 4 6 8 10 1 3 5 7 9 11 )  
  2. Sorted vector v1 = ( 0 1 2 3 4 5 6 7 8 9 10 11 )  
  3. Resorted (greater) vector v1 = ( 11 10 9 8 7 6 5 4 3 2 1 0 )  
  4. Resorted (UDgreater) vector v1 = ( 11 10 9 8 7 6 5 4 3 2 1 0 )  


 

自己的例子:  Vector容器 存放的CString变量

[cpp]  view plain  copy
  1. std::vector <CString> m_VectorImgName;  
[cpp]  view plain  copy
  1. #include "algorithm"  
  2.   
  3. BOOL STLSort(const CString &s1,const CString &s2)  
  4. {  
  5.     int i,j;  
  6.   
  7.     CString  name1=s1.Right(s1.GetLength()-s1.ReverseFind(L'\\')-1);  
  8.     CString  name2=s2.Right(s2.GetLength()-s2.ReverseFind(L'\\')-1);;  
  9.   
  10.         i=_ttoi(name1.Left(name1.Find(L'.')));  
  11.         j=_ttoi(name2.Left(name2.Find(L'.')));  
  12.   
  13.     return i<j;  
  14. }  


 

[cpp]  view plain  copy
  1. if(m_VectorImgName.size()>0)  
  2. {  
  3.   
  4.     std::sort(m_VectorImgName.begin(),m_VectorImgName.end(),STLSort);  

PS:这一篇也是可以的:点击打开链接

在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.begin();it!=vec.end();it++)
    cout<<*it<<endl;


(6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

(8)向量大小:vec.size();

(9)清空:vec.clear();

2

vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码:

#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
typedef struct rect
{
    int id;
    int length;
    int width;
  //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。
  bool operator< (const rect &a)  const
    {
        if(id!=a.id)
            return id<a.id;
        else
        {
            if(length!=a.length)
                return length<a.length;
            else
                return width<a.width;
        }
    }
}Rect;
int main()
{
    vector<Rect> vec;
    Rect rect;
    rect.id=1;
    rect.length=2;
    rect.width=3;
    vec.push_back(rect);
    vector<Rect>::iterator it=vec.begin();
    cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;    
    return 0;
}

 3  算法

(1) 使用reverse将元素翻转:需要头文件#include<algorithm>

reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,

一般后一个都不包含.)

(2)使用sort排序:需要头文件#include<algorithm>,

sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).

可以通过重写排序比较函数按照降序比较,如下:

定义排序比较函数:

bool Comp(const int &a,const int &b)
{
    return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、资源1项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值