vector容器使用
2012-07-07 14:57
417 查看
1 获得容器最后一个元素 ------ 使用 back或rbegin 取得
[cpp]
view plaincopyprint?
// back、rbegin 有常量和引用两种形式
std::vector<int> myVector;
myVector.back()=3;
std::vector<int>::reverse_iterator tailIter;
tailIter=myVector.rbegin();
*tailIter=3
iterator erase( iterator _Where ); iterator erase( iterator _First, iterator _Last ); |
_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 plaincopyprint?
#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;
}
#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 |
而应使用遍历 或assign函数的方式来赋值
[cpp]
view plaincopyprint?
//delNode.vectorNode 是与delPositionVector同类型容器
// vector 两容器不能直接赋值 可通过 遍历每个元素赋值,也可使用 assign赋值
VectorNode delNode;
delNode.numberOfFenkuai=nSelect;
Node nodeTemp;
[cpp] view plaincopyprint? // 这是错误的赋值方式 delNode.vectorNode=delPositionVector ; // 这是错误的赋值方式 delNode.vectorNode=delPositionVector ;
正确赋值方式一: 遍历
[cpp]
view plaincopyprint?
for (int i=0;i<delPositionVector.size();i++)
{
nodeTemp=delPositionVector.at(i);
delNode.vectorNode.push_back(nodeTemp);
}
[cpp] view plaincopyprint? delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end()); delNode.vectorNode.assign(delPositionVector.begin(),delPositionVector.end());
MSDN 示例:
[cpp]
view plaincopyprint?
#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
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 ); |
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 plaincopyprint?
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);
}
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某元素后,迭代器会失效 需要重新获得
CSDN 论坛中例子:
STL中的vector不是关联性容器,当插入新的元素后,原来取得的迭代器就会失效。
例子如下:
[cpp]
view plaincopyprint?
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!
[cpp] view plaincopyprint? 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! 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 合并两个顺序容器
[cpp]
view plaincopyprint?
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++));
[cpp] view plaincopyprint? // 删除线 std::vector<Node> delPosition; for (int i=0;i<g_DelVector.size();i++) { if (g_DelVector.at(i).numberOfFenkuai==nSelect) { delPosition.assign(g_DelVector.at(i).vectorNode.begin(),g_DelVector.at(i).vectorNode.end()); break; } } // 设置 underLine 下划线 std::vector<Node> underLinePosition; for (int i=0;i<g_underLineVector.size();i++) { if (g_underLineVector.at(i).numberOfFenkuai==nSelect) { underLinePosition.assign(g_underLineVector.at(i).vectorNode.begin(),g_underLineVector.at(i).vectorNode.end()); break; } } // 合并删除线 和 下划线 位置 Node node; std::vector<Node> erasePosition; std::vector<Node>::iterator i1=delPosition.begin(),i2=underLinePosition.begin(); while (i1!=delPosition.end()&&i2!=underLinePosition.end()) { if (i1->nStart==i2->nEnd) // 合并 同时前进++ { node.nStart=i2->nStart; node.nEnd=i1->nEnd; i1++; i2++; erasePosition.push_back(node); continue; } if (i1->nEnd==i2->nStart) { node.nStart=i1->nStart; node.nEnd=i2->nEnd; i1++; i2++; erasePosition.push_back(node); continue; } if (i1->nEnd<i2->nStart) { node=*i1; i1++; erasePosition.push_back(node); continue; } if (i1->nStart>i2->nEnd) { node=*i2; i2++; erasePosition.push_back(node); continue; } } while(i1!=delPosition.end()) erasePosition.push_back(*(i1++)); while(i2!=underLinePosition.end()) erasePosition.push_back(*(i2++)); / 整理erasePositon, 使得首尾相连的地方 进行合并 std::vector<Node>::iterator iter1,iter2; for (iter1=erasePosition.begin();iter1!=erasePosition.end();) { iter2=iter1+1; if (iter2!=erasePosition.end()) { if (iter1->nEnd==iter2->nStart) { iter1->nEnd=iter2->nEnd; iter1=erasePosition.erase(iter2); iter1--; continue; } } iter1++; } trueString=_T(""); CString mixString; GetRichEditCtrl().GetWindowText(mixString); int nStart=0; for (iter1=erasePosition.begin();iter1!=erasePosition.end();iter1++) { trueString+=mixString.Mid(nStart,iter1->nStart-nStart); nStart=iter1->nEnd; } trueString+=mixString.Mid(nStart); // 删除线 std::vector<Node> delPosition; for (int i=0;i<g_DelVector.size();i++) { if (g_DelVector.at(i).numberOfFenkuai==nSelect) { delPosition.assign(g_DelVector.at(i).vectorNode.begin(),g_DelVector.at(i).vectorNode.end()); break; } } // 设置 underLine 下划线 std::vector<Node> underLinePosition; for (int i=0;i<g_underLineVector.size();i++) { if (g_underLineVector.at(i).numberOfFenkuai==nSelect) { underLinePosition.assign(g_underLineVector.at(i).vectorNode.begin(),g_underLineVector.at(i).vectorNode.end()); break; } } // 合并删除线 和 下划线 位置 Node node; std::vector<Node> erasePosition; std::vector<Node>::iterator i1=delPosition.begin(),i2=underLinePosition.begin(); while (i1!=delPosition.end()&&i2!=underLinePosition.end()) { if (i1->nStart==i2->nEnd) // 合并 同时前进++ { node.nStart=i2->nStart; node.nEnd=i1->nEnd; i1++; i2++; erasePosition.push_back(node); continue; } if (i1->nEnd==i2->nStart) { node.nStart=i1->nStart; node.nEnd=i2->nEnd; i1++; i2++; erasePosition.push_back(node); continue; } if (i1->nEnd<i2->nStart) { node=*i1; i1++; erasePosition.push_back(node); continue; } if (i1->nStart>i2->nEnd) { node=*i2; i2++; erasePosition.push_back(node); continue; } } while(i1!=delPosition.end()) erasePosition.push_back(*(i1++)); while(i2!=underLinePosition.end()) erasePosition.push_back(*(i2++)); // 整理erasePositon, 使得首尾相连的地方 进行合并 std::vector<Node>::iterator iter1,iter2; for (iter1=erasePosition.begin();iter1!=erasePosition.end();) { iter2=iter1+1; if (iter2!=erasePosition.end()) { if (iter1->nEnd==iter2->nStart) { iter1->nEnd=iter2->nEnd; iter1=erasePosition.erase(iter2); iter1--; continue; } } iter1++; } trueString=_T(""); CString mixString; GetRichEditCtrl().GetWindowText(mixString); int nStart=0; for (iter1=erasePosition.begin();iter1!=erasePosition.end();iter1++) { trueString+=mixString.Mid(nStart,iter1->nStart-nStart); nStart=iter1->nEnd; } trueString+=mixString.Mid(nStart);
8 创建全局VECTOR变量,其元素仍为VECTOR类型 ---- 相当于二维数组
stdafx.h
定义数据结构,及声明变量
[cpp]
view plaincopyprint?
//-------------struct 定义的是结构 不是变量 所以不能在其前 加 extern
struct Node{
int nStart;
int nEnd;
};
struct VectorNode{
std::vector<Node> vectorNode;
int numberOfFenkuai;// 分块号
};
extern std::vector <VectorNode> g_DelVector;
// 声明的是变量 ,可以加extern 表示全局变量
extern std::vector <VectorNode> g_AddVector;
[cpp] view plaincopyprint? #include "stdafx.h" std::vector <VectorNode> g_DelVector; std::vector <VectorNode> g_AddVector; #include "stdafx.h" std::vector <VectorNode> g_DelVector; std::vector <VectorNode> g_AddVector;
9 排序
[cpp]
view plaincopyprint?
// 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;
}
[cpp] view plaincopyprint? 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 ) 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变量
[cpp]
view plaincopyprint?
std::vector <CString> m_VectorImgName;
[cpp] view plaincopyprint? #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; } #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; }
[cpp]
view plaincopyprint?
if(m_VectorImgName.size()>0)
{
std::sort(m_VectorImgName.begin(),m_VectorImgName.end(),STLSort);
if(m_VectorImgName.size()>0)
{
std::sort(m_VectorImgName.begin(),m_VectorImgName.end(),STLSort);
}
相关文章推荐
- 默认时使用vector,否则,选择其他合适的容器
- vector容器使用方法
- 用vector向量容器装入10个整数,使用迭代器iterator和accumulate算法统计这10个元素的和
- vector容器中iterator的使用
- vector向量容器(常用的使用方法总结)
- java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别
- c++容器(vector|map)中使用函数指针
- C++中vector容器类型的使用方法
- vector 容器使用时应该注意的内存分配问题
- java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别
- Eigen使用vector容器出错
- C++中使用vector容器
- STL基础5:vector容器的使用总结
- 容器vector和迭代器iterator的学习使用
- java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别
- 【STL】滤波算法:使用vector容器
- STL中Vector容器Find的使用(int查找)
- c++容器(vector|map)中使用函数指针
- 下面我使用vector容器为基础来构成一棵树
- 容器赋值 容器使用问题:vector subscript out of range