zoukankan      html  css  js  c++  java
  • oj教程--向量容器

    vector向量容器不但像数组一样对元素进行随机访问,还能在尾部插入元素,是一个简单、高效的容器, 完全可以替代数组。vector具有内存自动管理的功能,对于元素的插入和删除,可动态调整所占用的内存空间。
    使用vector向量容器,需要头文件包含声明“#include”vector容器的下标是从0开始计数的,也就是说,如果vector容器的大小是n,那么,元素的下标是0~n-1。对于vector容器的容量定义,可以事先定义一个固定大小,事后,可以随时调整其大小;也可以事先不定义,随时使用push_back()方法从尾部扩张元素,也可以使用insert()在某个元素位置前插入新元素。
    vector容器有两个重要的方法,begin()和end()。begin()返回的是首元素位置的迭代器(指针);end()返回的是最有一个元素的下一元素位置的迭代器(指针)。

    一、创建vector对象

    vector<type> vec1;                       // v1保存类型为type的对象,默认构造函数,v1为空
    vector<type> vec2(size);              // v2含有值初始化的元素的size个副本
    vector<type> vec3(size,value);    // v3包含值为value的size个元素
    vector<type> vec4(myvector);     // v4是myvector的一个副本
    vector<type> vec5(first,last);       // 用迭代器first和last之间的元素创建v5
    

    二、常用操作

    这里我们以vector<int> c;为例进行说明。
    

    1、容器的大小操作

    c.max_size():返回向量类型的最大容量(2^30-1=0x3FFFFFFF)
    c.capacity():返回向量当前开辟的空间大小(<= max_size,与向量的动态内存分配策略相关)。
    c.size():返回向量中现有元素的个数(<=capacity)。
    c.resize(n):调整向量的长度使其能容纳n个元素。
    c.resize(n,x):把向量的大小改为n,所有新元素的初值赋为x。
    c.empty():如果向量为空,返回真。
    

    2、元素的赋值操作

    c.assign(first,last):将迭代器first,last所指定范围内的元素复制到c 中。
    c.assign(num,val):用val的num份副本重新设置c。
    

    3、元素的访问操作

    c.at(n):等价于下标运算符[],返回向量中位置n的元素,因其有越界检查,故比[ ]索引访问安全。
    c.front():返回向量中第一个元素的引用。
    c.back():返回向量中最后一个元素的引用。
    c.begin():返回向量中第一个元素的迭代器。
    c.end():返回向量中最后一个元素的下一个位置的迭代器,仅作结束游标,不可解引用。
    c.rbegin():返回一个反向迭代器,该迭代器指向容器的最后一个元素。
    c.rend():返回一个反向迭代器,该迭代器指向容器第一个元素前面的位置。
    

    4、元素的删除操作

    c.pop_back():删除向量最后一个元素。
    c.clear():删除向量中所有元素。
    c.erase(iter):删除迭代器iter所指向的元素,返回一个迭代器指向被删除元素后面的元素。
    c.erase(start, end):删除迭代器start、end所指定范围内的元素,返回一个迭代器指向被删除元素段后面的元素。
    

    5、元素的插入操作

    c.push_back(x):把x插入到向量的尾部。
    c.insert(iter, x):在迭代器iter指向的元素之前插入值为x的新元素,返回指向新插入元素的迭代器。
    c.insert(iter,n,x):在迭代器iter指向的元素之前插入n个值为x的新元素,返回void。
    c.insert(iter,start,end):把迭代器start和end所指定的范围内的所有元素插入到迭代器iter所指向的元素之前,返回void。
    

    6、元素的交换操作

    c.reverse():反转元素顺序。
    c.swap(c2):交换2个向量的内容,c和c2 的类型必须相同。
    

    三、代码示例

    1、增加元素到尾部

    #include <iostream>
    #include <vector>
    using namespace std;
    int main(int argc, const char * argv[]) {
        vector<int> v;
        v.push_back(3);
        v.push_back(6);
        v.push_back(9);
        return 0;
    }
    

    2、下标访问

    #include <iostream>
    #include <vector>
    using namespace std;
    int main(int argc, const char * argv[]) {
        vector<int> v(3);
        v[0] = 3;
        v[1] = 6;
        v[2] = 9;
        cout << v[0] << " " << v[1] << " " << v[2] << endl;
        return 0;
    }
    

    3、迭代器访问

    #include <iostream>
    #include <vector>
    using namespace std;
    int main(int argc, const char * argv[]) {
        vector<int> v(3);
        v[0] = 3;
        v[1] = 6;
        v[2] = 9;
        //定义迭代器变量
        vector<int>::iterator it;
        for (it = v.begin(); it != v.end(); it++) {
            //输出迭代器上的元素值
            cout << *it << " ";
        }
        cout << endl;
        return 0;
    }
    

    4、增加元素

    #include <iostream>
    #include <vector>
    using namespace std;
    int main(int argc, const char * argv[]) {
        vector<int> v(3);
        v[0] = 3;
        v[1] = 6;
        v[2] = 9;
        
        //在最前面插入新元素,元素值为1
        v.insert(v.begin(), 1);
        
        //在第2个元素后插入新元素2
        v.insert(v.begin()+2, 2);
        
        //在向量的末尾追加新元素0
        v.insert(v.end(), 0);
        //定义迭代器变量
        vector<int>::iterator it;
        for (it = v.begin(); it != v.end(); it++) {
            //输出迭代器上的元素值
            cout << *it << " ";
        }
        //换行
        cout << endl;
        return 0;
    }
    

    5、删除元素

    #include <vector>
    #include <iostream>
    using namespace std;
    int main(int argc, const char * argv[]) {
        vector<int> v(10);
        //给向量赋值
        for (int i = 0; i < 10; i++) {
            v[i] = i;
        }
        vector<int>::iterator it;
        for (it = v.begin(); it != v.end(); it++) {
            //输出迭代器上的元素值
            cout << *it << " ";
        }
        //换行
        cout << endl;
        
        //删除第3个元素,即v[2]
        v.erase(v.begin()+2);
        for (it = v.begin(); it != v.end(); it++) {
            //输出迭代器上的元素值
            cout << *it << " ";
        }
        //换行
        cout << endl;
        
        //删除迭代器第1到第5区间(不包括第5区间)的所以元素
        v.erase(v.begin()+1, v.begin()+5);
        for (it = v.begin(); it != v.end(); it++) {
            //输出迭代器上的元素值
            cout << *it << " ";
        }
        //换行
        cout << endl;
        //清空向量
        v.clear();
        //输出向量大小
        cout << v.size() << endl;
        
        return 0;
    }
    
  • 相关阅读:
    手头上的几本关于实现程序设计语言的书
    Ubuntu 16.04 搭建KVM环境
    调用RESTful GET方法
    Ubuntu 16.04 安装Docker
    Ubuntu 16.04安装Java 8
    SecureCRT 多个会话显示在同一窗口
    Ubuntu 16.04 安装Maven3.3.9
    Python标准类型的分类
    Ubuntu 16.04 更改apt源
    LVM术语及相互关系
  • 原文地址:https://www.cnblogs.com/daxiang2008/p/10113464.html
Copyright © 2011-2022 走看看