C++语言中vector的使用
小标 2018-07-10 来源 : 阅读 990 评论 0

摘要:本文主要向大家介绍了C++语言中vector的使用,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

本文主要向大家介绍了C++语言中vector的使用,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

向量std::vector是一种对象实体,能够容纳许多各种类型相同的元素,包括用户自定义的类,因此又被称为序列容器。与string相同,vector同属于STL(Standard Template Library)中的一种自定义的数据类型,可以广义上认为是数组的增强版,相当于一个动态数组。

在使用它时,需要包含头文件vector: #include

vector是一个类模板,不是一种数据类型:

   

template<class alloc="allocator<T"> > class vector;</class>

   

vector可以存放任何类型的对象(但必须是同一类对象)。vector对象可以在运行时高效地添加元素。vector中元素是连续存储的,所以除了能够通过迭代器访问外,还可以通过常规的指针偏移量访问元素。换句话说,可以将指向vector元素的指针传入以指向数组元素的指针作为参数的函数。

vector会在需要时自动调整所占内存的大小。与对应的静态数组相比,vector 所占的内存通常要更多,因为它还分配了额外的内存以应对将来可能的扩张。于是,vector 就不必在每次插入元素时都重新分配一次内存了,除非这块预留的内存用尽。已分配内存的总大小可以通过 capacity() 函数查询。所占的额外的内存可以通过调用 shrink_to_fit()(c++11) 返还给系统。

从性能方面考虑,内存重分配操作的代价通常很大。如果事先知道元素个数,可以使用 reserve() 函数消除重新分配操作。

vector值初始化:

(1)、如果没有指定元素初始化,标准库自行提供一个初始化值进行初始化;

(2)、如果保存的是含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化;

(3)、如果保存的是没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。

vector容器内存放的所有对象都是经过初始化的。如果没有指定存储对象的初始值,那么对于内置类型将用0初始化,对于类类型将调用其默认构造函数进行初始化(如果有其它构造函数而没有默认构造函数,那么此时必须提供元素初始值才能放入容器中)。

下面是测试代码vector.cpp:

#include <vector>

#include <iostream>

#include

 

#include "vector.hpp"

 

int test_vector_init()

{

    std::vector<int> a; // 声明一个int型向量a,size为0

    std::vector<int> b(10); // 声明一个初始size为10的向量

    std::vector<int> c(10, 1); // 声明一个初始size为10且初始值都为1的向量

    std::vector<int> d(b); // 声明并用向量b初始化向量d

    std::vector<int> e(c.begin(), c.begin() + 3); // 将c向量中从第0个到第2个(共3个)作为向量e的初始值,size为3

 

    int n[] = { 1, 2, 3, 4, 5 };

    std::vector<int> f(n, n + 5); // 将数组n的前5个元素作为向量f的初值,size为5

    std::vector<int> g(&n[1], &n[4]); // 将n[1] - n[4]范围内的元素作为向量g的初值,size为3

 

    std::vector<std::string> v(5, "hello");

    std::vector<std::string> v2(v.begin(), v.end());

    assert(v == v2);

 

    assert(v.begin() + v.size() == v.end());

    assert(v.end() - v.size() == v.begin());

 

    std::vector<int> array{ 9, 7, 5, 3, 1 };

    std::cout << "array size: "<< array.size() << std::endl; // 5

 

    return 0;

}

 

int test_vector_access()

{

    int n[10];

    for (int i = 0; i < 10; i++) {

        n[i] = i;

    }

 

    std::vector<int> a(n, n + 10);

 

    // 对其中部分元素进行输入

    std::cin >> a[2];

    std::cin >> a[5];

    std::cin >> a[6];

 

    // 输出

    for (int i = 0; i < a.size(); i++) {

        std::cout << a[i] << " ";

    }

    std::cout << std::endl;

 

    // 使用遍历器(又称迭代器)进行输出

    // vector类的迭代器除了支持通用的前缀自增运算符外,还支持算术运算:it + n、it - n、it2 - it1

    std::vector<int>::iterator t;

    for (t = a.begin(); t != a.end(); t++) {

        std::cout << *t << " ";

    }

    std::cout << std::endl;

 

    for (std::vector<int>::const_iterator p = a.begin(); p != a.end(); p++) {

        std::cout << *p << " ";

    }

    std::cout << std::endl;

 

    size_t i = 0;

    int* x = a.data(); //返回指向内存中数组第一个元素的指针

    *x = -111;

    std::cout << "a[0]: " << a[0] << std::endl; // -111

 

    return 0;

}

 

int test_vector_operation()

{

    int n[10], m[15];

    for (int i = 0; i < 10; i++) {

        n[i] = i;

        m[i] = i + 20;

    }

 

    std::vector<int> a(n, n + 10);

    std::vector<int> b(m, m + 15);

    std::vector<int> x;

    x = a; // 赋值

 

    std::cout << "x size: "<= x.size())

    std::cout << "x max size: " << x.max_size() << std::endl; // 容器x能容纳的最大元素个数, 4611686018427387903

    x.reserve(15); // 预留存储空间,确保x.capacity() >= 15

    std::cout << "x capacity after reserve: " << x.capacity() << std::endl; // 15

    x.shrink_to_fit();

    x.resize(5); // 改变容器中可存储元素的个数,确保返回后,有x.size() == 5, 如果之前x.size() < 5, 那么用默认值补全

    std::cout << "x size after resize: " << x.size() << std::endl; // 5

 

    std::vector<int>::reference ref1 = b.front(); // 返回容器中第一个元素的引用(容器必须非空), 20

    std::vector<int>::reference ref2 = x.back(); // 返回容器中最后一个元素的引用(容器必须非空), 4

    int value = b[5]; // 返回下标为5的元素的引用(下标从0开始,如果下标不正确,则属于未定义行为), 25

    std::vector<int>::reference ref3 = b.at(5); // 返回下标为pos的元素的引用;如果下标不正确,则抛出异常, 25

    x.push_back(-100); // 将元素添加到容器末尾,向容器末尾添加一个元素

    value = x[x.size() - 1]; // -100

    std::cout << "x size after push_back: " << x.size() << std::endl; // 6

    x.pop_back(); // 删除最后一个元素, 弹出容器中最后一个元素(容器必须非空)

    value = x[x.size() - 1]; // 4

    std::cout << "x size after pop_back: " << x.size() << std::endl; // 5

 

    x.assign(10, -1); // 赋值,用指定元素序列替换容器内所有元素

    std::cout << "x size after assign: " << x.size() << std::endl; // 10

    std::cout << "x[0]: " << x[0] << std::endl; // -1

 

    std::cout << "a is empty: "<< a.empty() << std::endl; // 判断向量是否为空, 0

    std::cout << "a size: " << a.size() << std::endl; // 获取向量中的元素个数, 10

    a.clear(); // 删除全部内容, 清空向量中的元素,相当于调用erase(begin(), end())

    std::cout << "size after clear: " << a.size() << std::endl; // 0

 

    std::vector<int> c;

    c = b; // 将b向量复制到c向量中

 

    std::cout << "a == b ?: " << (a == b) << std::endl; // == 、 != 、>、 >= 、<、 <= , 采用字典排序策略比较,a向量与b向量比较, 相等则返回1, 0

    std::cout << "c == b ?: " << (c == b) << std::endl; // == 、 != 、>、 >= 、<、 <= , 采用字典排序策略比较,c向量与b向量比较, 相等则返回1, 1

 

    // 插入和删除操作将发生元素的移动(为了保持连续存储的性质),所以之前的迭代器可能失效

    // 任何改变容器大小的操作都可能造成以前的迭代器失效

    std::cout << "b size: " << b.size() << std::endl; // 15

    b.insert(b.begin(), -1); // 将-1插入到向量b的起始位置前

    std::cout << "b[0]: " << b[0] << std::endl; // -1

    std::cout << "b size: " << b.size() << std::endl; // 16

 

    b.insert(b.begin() + 5, 3, -1); //将-1分别插入到向量元素位置的5-8处(共3个元素)

    for (int i = 0; i < b.size(); i++) {

        std::cout << b[i] << "  "; // -1 20 21 22 23 -1 -1 -1 24 25 ...

    }

    std::cout<<std::endl; int=""> d(5, 1);

    std::vector<int> e(10);

    e.insert(e.begin(), d.begin(), d.end()); //将d.begin(), d.end()之间的全部元素插入到e.begin()前

    for (int i = 0; i < e.size(); i++) {

        std::cout << e[i] << "  "; // 1 1 1 1 1 0 0 0 ...

    }

    std::cout << std::endl;

 

    std::cout << "b size: " << b.size() << std::endl; // 19

    b.erase(b.begin()); // 将起始位置的元素删除

    std::cout << "b size: " << b.size() << std::endl; // 18

    b.erase(b.begin(), b.begin() + 3); // 将(b.begin(), b.begin()+3)之间的元素删除

    std::cout << "b size: " << b.size() << std::endl; // 15

 

    b.swap(c); // 交换vector的内容, a向量与c向量进行交换

    for (int i = 0; i < b.size(); i++) {

        std::cout << b[i] << "  ";

    }

    std::cout << std::endl;

 

    for (int i = 0; i < c.size(); i++) {

        std::cout << c[i] << "  ";

    }

    std::cout << std::endl;

 

    return 0;

}

 

int test_vector_two_dimension()

{

    // reference: https://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html

 

    std::vector< std::vector<int> > b(10, std::vector<int>(5, -1));

 

    // 对部分数据进行输入

    std::cin >> b[1][1];

    std::cin >> b[2][2];

    std::cin >> b[3][3];

 

    // 全部输出

    for (int m = 0; m < b.size(); m++) { //b.size()获取行向量的大小

        for (int n = 0; n < b[m].size(); n++) { //获取向量中具体每个向量的大小

            std::cout << b[m][n] << "  ";

        }

        std::cout << std::endl;

    }

 

    return 0;

}</int></int></int></std::endl;></int></int></int></int></a.size()></int></int></int></int></int></int></int></std::string></std::string></int></int></int></int></int></int></int></assert.h></iostream></vector>

   

 

GitHub:https://github.com/fengbingchun/Messy_Test

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程