pre{
line-height:1;
color:#38ede1;
background-color:#5b2814;
font-size:16px;}.sysFunc{color:#008080;font-style:italic;font-weight:bold;}
.selfFuc{color:#008080;}
.bool{color:#952fa4;}
.condition{color:#ca5cb9;font-weight:bold;}
.key{color:#85d7e6;}
.var{color:#a6caf0;font-style:italic;}
.Digit{color:#c0c0c0;font-weight:bold;}
.includePre{color:#e1ed38;}
.operator {color:#6de9b8;font-weight:bold;}

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位置进行删除的。
   删除元素时,返回值为:位于删除的元素之后的第一个的元素所在的位置
 
 
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函数的方式来赋值

 

 

       //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());  
 
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.

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某元素后,迭代器会失效  需要重新获得

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

自己的例子:

 

    // 删除线  
    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

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

 

 

    //-------------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;  
stdafx.cpp  为.H中所声明的变量进行定义
 

 

    #include "stdafx.h"  
      
      
     std::vector <VectorNode>   g_DelVector;  
     std::vector <VectorNode> g_AddVector;  
 
 

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 )  
 

自己的例子:  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);  

本文使用 书画小说软件 发布,内容与软件无关,书画小说软件 更惬意的读、更舒心的写、更轻松的发布。

 

vector容器使用总结 .xml的更多相关文章

  1. 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...

  2. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  3. vector容器使用和assert断言关键字

    C++里面的容器是个比较复杂的东西,我这篇只说vector容器怎么使用,详细的网搜. vector模板类其实是一个动态数组,跟自己用new关键字创建数组一样,只不过vector会自动帮我们用new和d ...

  4. C++杂谈(二)初识vector容器与迭代器

    教科书中失踪的vector 很奇怪的一件事情,在当时学习C++的时候,老师并没有讲授容器的内容,当时参考的谭浩强老师的红皮C++也没有这个内容,不知为何.后来再学C++,发现容器是一个很重要的概念,在 ...

  5. vector容器的用法

    转自一篇博客^-^: 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.p ...

  6. C++ Daily《2》----vector容器的resize 与 reserve的区别

    C++ STL 库中 vector 容器的 resize 和 reserve 区别是什么? 1. resize 改变 size 大小,而 reserve 改变 capacity, 不改变size. 2 ...

  7. 跟我一起学STL(2)——vector容器详解

    一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...

  8. vector容器+iterator迭代器

    关于vector容器的详细描述,可参考:http://www.jb51.net/article/41648.htm   关于iterator迭代器的描述,可参考http://www.cppblog.c ...

  9. 提高Vector容器的删除效率

    vector容器是类似与一个线性数组,索引效率高,插入,删除的效率很低,需要遍历数据列表,一般情况下vector的删除操作由一下函数完成: iterator erase(iterator positi ...

随机推荐

  1. jboss内存管理

    jboss内存查看 1. 用浏览器打开网址:http://IP:port/jmx-console/ 2. 找到 jboss.system 一节,或者在 filter 文本框中输入 jboss.syst ...

  2. Highcharts AJAX JSON JQuery 实现动态数据交互显示图表 柱形图

    http://my.oschina.net/xshuai/blog/345117?fromerr=hEXYMdR0 http://www.oschina.net/code/snippet_144464 ...

  3. Highcharts axja 获取json对象动态生成报表生成

    最近做个项目,项目经理想做一个统计报表,在网上查看些资料就选用Highchars 这里和大家分享下使用心得. 重点说明此代码是针对一个报表显示多个项对比显示. 直接贴代码:web端 <scrip ...

  4. 解决Android开发中,ActiveAndroid和Gson同时使用,对象序列化失败的问题

    ActiveAndroid是安卓开发常用的ORM框架. Gson则是Google提供的轻量级序列化框架,非常适合Android开发使用. 但这两者同时使用,会产生序列化失败的问题.你通常会收到如下信息 ...

  5. SQL Service Database BACKUP & RESTORE

    1. 完整恢复模式下的数据库备份 USE master; ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL; GO -- Back up the ...

  6. 使用C#开发ActiveX控件(新) 转 http://www.cnblogs.com/yilin/p/csharp-activex.html

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  7. samba linux windows 请联系管理员

    在使用Samba进行建立Window与Linux共享时,要是不能访问,出现“您可能没有权限使用网络资源”, 那就是SELinux在作怪了 要是想让共享目录能访问,可以使用命令 #setenforce ...

  8. 12.allegro环境设置[原创]

    一.菜单简介 --- 分割电源,分割平面 ------- ------- ------- ----- --------- ---- --------------- ----------------- ...

  9. BZOJ 1415 聪聪和可可(概率DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1415 题意:一个无向图,一个猫.一只老鼠.在任意时刻猫知道老鼠在哪个顶点上.每次移动猫先 ...

  10. cocos2dx 坐标系 -转

    (原文出处找不到了) 无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥奔头了.所以玩cocos2d,一上来就先把各种与坐标有关的东西搞清楚. 基本的两个坐标系:屏幕坐标系和GL ...