原文链接:点击打开链接
1 获得容器最后一个元素 ------ 使用 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位置进行删除的。
删除元素时,返回值为:位于删除的元素之后的第一个的元素所在的位置
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示例:
- #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;
- }
Output
|
---|
v1 = 10 20 30 40 50
v1 = 20 30 40 50
v1 = 20 50 |
3 两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());
MSDN 示例:
- #include <vector>
- #include <iostream>
-
- int main( )
- {
- using namespace std;
- vector<int> v1, v2, v3;
- 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;
-
- v2.assign(v1.begin(), v1.end());
- cout << "v2 = ";
- for (iter = v2.begin(); iter != v2.end(); iter++)
- cout << *iter << " ";
- cout << endl;
-
- v3.assign(7, 4) ;
- cout << "v3 = ";
- for (iter = v3.begin(); iter != v3.end(); iter++)
- cout << *iter << " ";
- cout << endl;
- }
-
-
- Output
-
- v1 = 10 20 30 40 50
- v2 = 10 20 30 40 50
- v3 = 4 4 4 4 4 4 4
-
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.
6 push_back或pop某元素后,迭代器会失效 需要重新获得
CSDN 论坛中例子:
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;
注意最后一句,运行到最后一句时就会发生崩溃,迭代器访问错误。插入元素后,要重新取得迭代器。
而对于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;
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++));
自己的例子:
8 创建全局VECTOR变量,其元素仍为VECTOR类型 ---- 相当于二维数组
stdafx.h
定义数据结构,及声明变量
-
- struct Node{
-
- int nStart;
- int nEnd;
- };
-
-
- struct VectorNode{
-
- std::vector<Node> vectorNode;
- int numberOfFenkuai;
- };
-
-
- extern std::vector <VectorNode> g_DelVector;
- extern std::vector <VectorNode> g_AddVector;
stdafx.cpp 为.H中所声明的变量进行定义
- #include "stdafx.h"
-
-
- std::vector <VectorNode> g_DelVector;
- std::vector <VectorNode> g_AddVector;
9 排序
-
-
- #include <vector>
- #include <algorithm>
- #include <functional> // For greater<int>( )
- #include <iostream>
-
-
- 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;
-
-
- sort( v1.begin( ), v1.end( ), greater<int>( ) );
- cout << "Resorted (greater) vector v1 = ( " ;
- for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
- cout << *Iter1 << " ";
- cout << ")" << endl;
-
-
- 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 )
自己的例子: Vector容器 存放的CString变量
- std::vector <CString> m_VectorImgName;
- #include "algorithm"
-
- BOOL STLSort(const CString &s1,const CString &s2)
- {
- int i,j;
-
- CString name1=s1.Right(s1.GetLength()-s1.ReverseFind(L'\\')-1);
- CString name2=s2.Right(s2.GetLength()-s2.ReverseFind(L'\\')-1);;
-
- i=_ttoi(name1.Left(name1.Find(L'.')));
- j=_ttoi(name2.Left(name2.Find(L'.')));
-
- return i<j;
- }
- if(m_VectorImgName.size()>0)
- {
-
- 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),这样就降序排序。