从零开始学C++之标准库类型(二):vector 类简介和例程

一、标准库的vector类型

vector是同一种类型的对象的集合

vector的数据结构很像数组,能非常高效和方便地访问单个元素

vector是一个类模板(class template) 

vector不能存放引用。

template <
   class Type, 
   class Allocator = allocator<Type> 
>
class vector

要使用vector必须包含相关头文件

#include <vector> using std::vector; 

vector对象的初始化:

vector类定义了好几种构造函数 vector<T>  v1;  //vector保存类型为T的对象。默认构造函数v1为空 vector<T> v2(v1);// v2是v1的一个副本  vector<T> v3(n, i); //v3包含n个值为i的元素  vector<T> v4(n); //v4含有值初始化的元素的n个副本 vector<T> v5(v1.begin(), v1.end());  // iterating through v1

vector常用成员函数:

resize 和 reserve的区别:

void reserve(size_type n);

(1)如果n大于容器现有的容量(即capacity()),则需要在自由内存区为整个容器重新分配一块更大的连续空间,其大小为sizeof(T)*n,然后将容器内所有有效元素全部复制到新位置(调用拷贝构造函数),最后释放旧位置的所有存储空间并调整容器的成员指针。注意:容器的大小(即size())并没有发生改变。

(2)否则,什么也不做。

void resize(size_type n, const T& c = T());

(1)如果n大于容器当前的大小(即size()),则在容器的末尾插入n-size()个初值为c的元素,如果不指定初值,则用元素类型的默认构造函数来初始化(这可能引起内存重分配以及容器容量的扩张)。

(2)如果n小于容器当前的大小,则从容器的末尾删除size()-n 个元素,但不释放元素本身的内存空间,因此容量不变。

(3)否则,什么也不做。

e.g

vector<char> vec; printf(”%zd %zd\n”, vec.size(), vec.capacity()); vec.resize(1024); printf(”%zd %zd\n”, vec.size(), vec.capacity()); vec.resize(1300); printf(”%zd %zd\n”, vec.size(), vec.capacity());

运行结果: 0 0 # 一开始size() 和capacity() 都是0 1024 1024 # resize(1024) 之后size() 和capacity() 都是1024 1300 2048 # resize(稍大) 之后capacity() 翻倍,相当于reserve(2048)

例程1:

#include <vector>
#include <iostream>
using namespace std;


typedef vector<int> INTVEC;

//void ShowVec(const INTVEC& v)
//{
//  unsigned int i;
//  for (i=0; i<v.size(); i++)
//  {
//      cout<<v[i]<<" ";
//  }
//  cout<<endl;
//}


//void ShowVec(INTVEC& v)
//{
//  INTVEC::iterator it;
//  for (it=v.begin(); it!=v.end(); ++it)
//  {
//      cout<<*it<<" ";
//  }
//
//  cout<<endl;
//}

void ShowVec(const INTVEC &v)
{
    INTVEC::const_iterator it;
    for (it = v.begin(); it != v.end(); ++it) //所有迭代器都重载了!=运算符,但有些没有重载<运算符。
    {
        cout << *it << " ";
    }

    cout << endl;
}

int main(void)
{
    INTVEC v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    ShowVec(v);

    return 0;
}

例程2:

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


typedef vector<int> INTVEC;

void ShowVec(const INTVEC &v)
{
    INTVEC::const_iterator it;
    for (it = v.begin(); it != v.end(); ++it)
    {
        cout << *it << " ";
    }

    cout << endl;
}

int main(void)
{
    INTVEC v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    v.push_back(3);
    //cout<<v.back()<<endl;
    //v.pop_back();

    ShowVec(v);

    //v.erase(v.begin()+2);
    //v.erase(v.begin(), v.begin()+2);

    v.erase(remove(v.begin(), v.end(), 3), v.end());
    ShowVec(v);

    return 0;
}

例程3:

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


typedef vector<int> INTVEC;

void ShowVec(const INTVEC &v)
{
    INTVEC::const_iterator it;
    for (it = v.begin(); it != v.end(); ++it)
    {
        cout << *it << " ";
    }

    cout << endl;
}

int main(void)
{
    INTVEC v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    v.push_back(3);

    ShowVec(v);

    //v.erase(remove(v.begin(), v.end(), 3), v.end());
    INTVEC::iterator it;
    for (it = v.begin(); it != v.end(); /*++it*/)
    {
        if (*it == 3)
        {
            it = v.erase(it);   // erase返回的是当前删除元素的下一个元素
        }
        else
            ++it;
    }
    ShowVec(v);

    return 0;
}

参考:

C++ primer 第四版 Effective C++ 3rd C++编程规范

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

【Objective-C】05-第一个OC的类

说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C。如果你还没有编程经验,...

21510
来自专栏WindCoder

Python第五周学习笔记

发现之前并没有字符串相关的介绍,再者此次做的有点多,就整理一下发出来算了。此处的例子将代码和运行结果写在了一起,并未分开,细心看下也是可以看懂的,一般不存在 >...

671
来自专栏Golang语言社区

[Go语言]从Docker源码学习Go——指针和Structs - lemon_bar

http://www.cnblogs.com/lemonbar/p/3932981.html 主题 Go语言 Docker function和method关...

3634
来自专栏阿凯的Excel

Python读书笔记6(列表-基本特性)

前期和大家分享了数字和字符串,如果数字和字符串都是单一的个体的话,列表就是将多个数字和字符串组合在一起,形成列表。列表概念与数组概念类似,是包含任意对象的有序集...

2765
来自专栏前端那些事

RegExp正则匹配模式汇总

 正则表达式提供另一种强大的文本搜索和处理方式,对于正则表达式,不同语言有着不同的实现,JavaScript采用的Perl5的语法。对于极少数匹配模式是简单的全...

2046
来自专栏python3

python3--基础数据类型

切片就是通过索引(索引:索引:步长)截取字符串的一段,形成新的字符串(原则就是顾头不顾尾)

712
来自专栏Laoqi's Linux运维专列

python3–函数

4565
来自专栏Spring相关

带返回值的函数,闭包,沙箱,递归详解

那了解了函数 this 指向的不同场景之后,我们知道有些情况下我们为了使用某种特定环境的 this 引用, 这时候时候我们就需要采用一些特殊手段来处理了,例如...

392
来自专栏一个默默无闻的工程师的日常

nova boot vm with '--nic net-id=xxxx, v4-fixed-ip=xxx' failed

1323
来自专栏IMWeb前端团队

Es6浅析

Es6浅析 Babel 是一个 JavaScript编译器,它可以把我们编写的符合 ECMAScript 6 标准的代码完美地转换为 ECMAScript 5 ...

1827

扫码关注云+社区