STL之vector介绍

本文主要介绍STL中的vector的概念及用法。

1. 概述

vector是C++ STL中的部分内容,是同一种类型的对象的集合,每个对象都有一个对应的整数索引值,和(C++中的)string对象一样,标准库负责管理与存储元素相关的内存。

我们有时候会把vector称为容器,是因为它可以包含其他对象,能够存放任意类型的动态数组、增加和压缩数据。一个容器中的所有对象都必须是同一种类型的。

vector不是一种数据类型,而是一个类模板(class template)。使用模板可以编写一个类定义或函数定义,用于多个不同的数据类型,因此,我们可以定义保存string对象的vector、或保存int值的vector、又或是保存自定义的类型对象的vector。

2. 常见用法

2.1 构造vector

通常我们采用下面的方式构造vector:

typedef vector<int> vecInt;
vecInt vecint;

2.2 添加元素

vector添加数据的缺省方法是push_back(),push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存,如下:

vecint.push_back(i+1);

2.3 遍历元素

我们可以通过使用vector的迭代器iterator、调用vector对象的begin()和end()函数,实现对于vector中数据的遍历,如下:

vecInt::iterator it;
for (it = vecint.begin(); it != vecint.end(); it++)
{
    cout << *it << endl;
}

2.4 查询元素

通常使用at方法查询(访问)元素,at方法会检查下标是否越界,如果是,则抛出“out of range”异常。用法如下:

vecint.at(1)

2.5 删除元素

使用erase(pos)方法来删除元素,erase()方法删除pos位置的数据,返回下一个数据的位置。用法如下:

// 删除数据,删除最后一个元素
it = vecint.end();
it = it - 1;                // 需要注意,(it - 1)对应最后一个元素
vecint.erase(it);

2.6 插入元素

使用insert(pos, elem)方法,在pos位置插入一个elem拷贝,返回新数据位置。用法如下:

// 插入数据,在最后一个元素之前插入数据
it = vecint.end();
it = it - 1;
vecint.insert(it, 100);

注意:在删除和插入元素时,需要特别注意pos位置(及迭代器对象it)对应的元素位置。vecint.end()方法会指向最后一个元素的下一个位置,所以删除最后一个元素/在最后一个元素之前插入元素时,需要(it -1)。

3. 示例程序

本文前面介绍的代码对应的完整示例程序如下:

#include <vector>
#include <iostream>

using namespace std;

int main()
{
    typedef vector<int> vecInt;
    vecInt vecint;

    // 添加数据
    for (int i = 0; i < 5; i++)
    {
        vecint.push_back(i+1);
    }

    // 遍历元素
    vecInt::iterator it;
    cout << "vecint is: " << endl;
    for (it = vecint.begin(); it != vecint.end(); it++)
    {
        cout << *it << endl;
    }

    // 查询数据
    cout << "the second element is: " << vecint.at(1) << endl;

    // 删除数据,删除最后一个元素
    it = vecint.end();
    it = it - 1;                // 需要注意,(it - 1)对应最后一个元素
    vecint.erase(it);

    // 再次遍历元素,观察删除操作是否成功
    cout << "after del, vecint is: " << endl;
    for (it = vecint.begin(); it != vecint.end(); it++)
    {
        cout << *it << endl;
    }

    // 插入数据,在最后一个元素之前插入数据
    it = vecint.end();
    it = it - 1;
    vecint.insert(it, 100);
    
    // 再次遍历元素,观察插入操作是否成功
    cout << "after insert, vecint is: " << endl;
    for (it = vecint.begin(); it != vecint.end(); it++)
    {
        cout << *it << endl;
    }
    
    return 0;
}

上述代码的运行结果如下:


猜你喜欢

转载自blog.csdn.net/liitdar/article/details/80059795