vector API详细学习

  vector是一种顺序容器。

  构造函数:

  vector();
  vector( const vector& c );
  vector( size_type num, const TYPE& val = TYPE() );
  vector( input_iterator start, input_iterator end );

  例子:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    //第一种:无参数
    vector<int> v;
    v.push_back(10);
    v.push_back(1);
    for(auto i : v)
        cout << i << endl;

    //第二种:用已有的vector来初始化
    vector<int> v2(v); //将一个容器复制给另外一个容器,容器类型和元素类型都必须相同
    for(auto i : v2)
        cout << i << endl;

    //第三种:指定容器内元素的个数,每个元素用默认值
    vector<int> v3(4); //int的默认值是0
    for(auto i : v3)
        cout << i << endl;

    //第四种:指定容器内元素的个数,指定每个元素的值
    vector<int> v4(4,1); //4个1
    for(auto i : v4)
        cout << i << endl;

    //第五种:将迭代器指定范围内的元素赋值给容器
    auto beginIt = v.begin();
    auto endIt = v.end();
    vector<int> v5(beginIt, endIt);
    for(auto i : v5)
        cout << i << endl;

    return 0;
}

  注意: (1) 将一个容器复制给另外一个容器,容器类型和元素类型都必须相同。

      (2) 指针也是迭代器。

    int a[4] = {1,2,3,4};
    vector<int> v5(a, a+4);
    for(auto i : v5)
        cout << i << endl;

     (3) 其他容器的迭代器也能用来初始化vector

list<int> l;
    l.push_back(10);
    l.push_back(4);
    vector<int> v6(l.begin(), l.end());
    for(auto i : v6)
        cout << i << endl;

  vector常用API:

  现在一个个分析:

1. assign

  这是一种赋值方法,但是会覆盖原来容器内的值。

  void assign( size_type num, const TYPE& val ); //num个val的值
  void assign( input_iterator start, input_iterator end );

  例子:

//第一种:赋值为num个val值
    vector<int> v(3,5); //这里初始化为3个5
    v.assign(4,10); //会覆盖上面的初始值
    for(auto i : v)
        cout << i << endl; //输出4个0

    //第二种:利用迭代器
    vector<int> v2(v.begin(), v.end());
    for(auto i : v)
        cout << i << endl; //输出4个0

2. at

  返回对应坐标的值,作用同利用下标访问。

3. back

  返回最后一个元素的值。

    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    cout << v.back() << endl; //输出2

4. begin

  返回指向第一个元素的迭代器。

5. capacity

  返回vector容器的容量,注意和大小是不同的,容量总是大于等于大小。vector总是定义一个较大的值作为容量,这样就不用每次增加元素时都换到较大的空间(这需要花费时间)。当元素增加到超过capacity时,capacity会自动加倍。

    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3); //一共3个元素
    cout << v.capacity() << endl; //输出4

6.  clear

  清空所有元素,变为空(不是默认值),但是capacity还是不变的。

 vector<int> v(10,1);
 v.clear();

7. empty

  判断vector是否为空。

vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.clear();
    cout << v.empty() << endl; //输出1

  

8. end

  返回指向最后一个元素后面一位的迭代器。

9. erase

  删除迭代器指定的元素。

  iterator erase( iterator loc );
  iterator erase( iterator start, iterator end );

  例子:

    //第一种:删除迭代器指定的元素
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.erase(v.begin());
    cout << v[0] << endl; //输出2
    //第二种:删除迭代器指定的范围
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.erase(v.begin(), v.begin()+2);
    for(auto i : v)
        cout << i << endl; //输出3

  PS.耗时O(n)

10. front

  返回指向第一个元素的引用。

11. insert

  在指定的位置之前插入元素。

方法:

  iterator insert( iterator loc, const TYPE& val );
  void insert( iterator loc, size_type num, const TYPE& val );
  template<TYPE> void insert( iterator loc, input_iterator start, input_iterator end );

例子:

    vector<int> v(2,1);
    vector<int> temp(3,3);
    v.insert(v.begin(), 11); //在begin之前插入11,即11变成第一个元素
    v.insert(v.begin(), 2, 22); //在begin之前插入2个22
    v.insert(v.begin(), temp.begin(), temp.end()); //在begin之前插入temp从begin到end的所有元素
    for(auto e : v)
        cout << e << endl;

12. max_size

  返回vector能容纳的元素数量的上限。注意,size是当前的元素数量,capacity是稍大于size的容量,而max_size是能容纳的最大数量。

  在我的64位机子上,该值是4611686018427387903,即8字节。

13. pop_back

  移除最后一个元素。

14. push_back

  添加元素到最后。

    vector<int> v;
    for(int i=0; i<10; i++)
        v.push_back(i);

    for(auto e : v)
        cout << e << endl;

15. rbegin

  返回reverse_iterator(逆迭代器),指向最后一个元素,而且方向是向begin移动(一般迭代器加正值是向vector尾移动)。

  

16. rend

  返回指向第一个元素前面的reverse_iterator。

    vector<int> v;
    for(int i=0; i<10; i++)
        v.push_back(i);
    auto i = v.rbegin();
    while(i != v.rend())
        cout << *i++ << endl; //逆序输出vector

17. reserve

  设置capacity的大小,如果小于原来的capacity则无效。

    vector<int> v(10,1);
    v.reserve(15);
    cout << "capacity: " << v.capacity() << endl; //输出15
    v.reserve(5);
    cout << "capacity: " << v.capacity() << endl; //输出15
    for(auto e : v)
        cout << e << " ";

18.  resize

方法:

void resize( size_type num, const TYPE& val = TYPE() );

例子:

    //第一种
    vector<int> v(10,1);
    v.resize(15);
    cout << v.size() << endl; //输出15
    for(auto e : v)
        cout << e << " "; //多出来的5个元素填充为默认值0
    cout << endl;
    v.resize(5);
    cout << v.size() << endl; //输出5
    for(auto e : v)
        cout << e << " "; //多余元素被移除

    //第二种
    v.resize(15, 8); //指定多出的元素赋值为8
    cout << v.size() << endl; //输出15
    for(auto e : v)
        cout << e << " "; //多出来的元素填充为指定值8

19. size

  返回当前含有的元素数量。

20.  swap

  交换指定容器的内容。

方法:

void swap( container& from );

例子:

    vector<int> v1(4,1);
    vector<int> v2(6,4);
    v1.swap(v2);
    for(auto e : v1)
        cout << e << endl;
    for(auto e : v2)
        cout << e << endl;
时间: 2024-10-12 16:55:14

vector API详细学习的相关文章

压缩跟踪(CT)代码详细学习_模块1(样本的采集和扩充)

本章主要详解的是compressive tracking框架中的第一部分:样本的采集和扩充部分. 在开始代码学习的前面,你需要知道的理论知识参见论文:Real-time Compressive Tracking.理论理解可以参见我的博客:http://blog.csdn.net/ikerpeng/article/details/19826409 . 这个模块中你需要知道一个基本的概念:代码里面几个变量指的是什么.上一张图: 也许你现在还不知道他们是什么,直接贴代码了.相信有我的注释你一定会懂的.

Android 服务类Service 的详细学习

上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道.它们可以在无形中使我们的软件和网络.数据库.系统等进行交互,之后通过UI(Notification就是一种展示方式)把结果展现在我们面前.可以说,他们是android生命体系里面的神经系统,通过反射条件让身体展现不同的状态.在整个系统中,广播接收器充当着是传输者和监听者的角色,它把系统的一点点变化都反馈上去,之后

Hibernate的核心API ---- 入门学习

叙:学习hibernate是必不可少的要了解其核心的API,下面电虫就核心API进行记录学习: Hibernate核心API Hibernate核心API有configuration.SessonFactory.Session.Transaction等,在Session中有增删改查等小地API,下面进行详细学习: 学习要有目标有方向,所以从一段代码中从上到下的进行研读不失为一种高效率的学习方法,学习模板代码如下所示: 1 package com.java.hibernate.demo1; 2 3

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

ADO.NET详细学习笔记

[1]ADO.NET和ADO的区别: ADO以Recordset存储,而ADO.NET则以DataSet表示.Recordset看起来更像单表,如果让Recordset以多表的方式表示就必须在SQL中进行多表连接.反之,DataSet可以是多个表的集合.ADO 的运作是一种在线方式,这意味着不论是浏览或更新数据都必须是实时的.ADO.NET则使用离线方式,在访问数据的时候ADO.NET会利用XML制作数据的一份幅本,ADO.NET的数据库连接也只有在这段时间需要在线. 由于ADO使用COM技术,

JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事.当然,在学校里考试之前当然要把所有内容学一遍和复习一遍.但是,到了社会里做事,很多时候都是边做边学.应聘如此,工作如此,很多的挑战都是如此.没办法,硬着头皮上吧. 3.5 线程的分组管理 在实际的开发过程当中,可能会有多个线程同时存在,这对批量处理有了需求.这就有点像用迅雷下载电视剧,假设你在同时

压缩跟踪(CT)代码详细学习_模块2(特征的提取和计算)

0.下载安装Opencv,当前版本为249. 1.下载Python,当前OPencv版本为249,不过其支持的最新版本的Python为2.7,所以可以下载276版本. 2.下载numpy,开始我使用了1.6,没有通过,错误如图.下载了最新的1.8.1版本. 3.将Opencv安装目录下opencv\build\python\2.7\x86中的cv2.pyd复制到python安装目录Lib\site-packages下. 4.找到opencv源文件内的draw.py运行. 压缩跟踪(CT)代码详细

压缩跟踪(CT)代码详细学习0

接下来我想比对CT那篇文章(http://blog.csdn.net/ikerpeng/article/details/19826409)的代码,逐行的解释,逐行的敲代码并最终实现.希望通过这个过程提高我的C编程的能力,以及对于目标跟踪的框架更进一步熟悉.希望对于后面的研究打下好的基础. 当然我会从各个模块的角度来书写,这样思路更加的清晰一点.大致的思路如下: 1中主要包括两个函数,扩充正负样本的函数,原理参见http://blog.csdn.net/ikerpeng/article/detai