曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3606|回复: 2
打印 上一主题 下一主题

vector 类的简单使用

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2012-1-11 13:49:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STL (Standard Template Library 标准模板库) 中定义了几种不同类型的容器 -- 用来保存其他对象的对象。vector 类便是其中一种,它可能是用得最广泛的容器类,它用来支持动态数组(可以根据需要改变大小的数组)。

在 C++ 中,数组的大小在编译时是固定的,这种实现数组的方法效率最高,但同时局限性也最大,因为程序在运行时不能改变数组的大小来适应程序的需求。而 vector 就可以根据需要来分配内存,从而解决了这个问题。虽然 vector 是动态数组,但我们还是能够使用标准数组的下标来访问它。

vector 类中也有许多成员函数来操作数组。如果使用过 javascript,php 等脚本语言,那么对这些操作方法就会觉得类似而熟悉。下面是简单的测试代码:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> v;    //创建一个大小为 0 的 vector 对象
    unsigned int i;

    //输出对象 v 的初始大小(值为 0)
    cout << "size = " << v.size() << endl;

    //将值添加到 v 的末位 -- v 将根据需要增加大小
    for (i = 0; i < 10; i++)
        v.push_back(i);

    //输出对象 v 的当前大小
    cout << "Current contents:\n";
    cout << "Size now = " << v.size() << endl;

    //输出对象 v 中的内容
    for (i = 0; i < v.size(); i++) cout << v[i] << " ";
    cout << endl;

    //将更多的值添加到 v 的末尾 -- v将再次根据需要增加大小
    for (i = 0; i < 10; i++) v.push_back(i + 10);

    //输出对象 v 的当前大小
    cout << "Size now = " << v.size() << endl;

    //输出对象 v 中的内容
    cout << "Current contents:\n";
    for (i = 0; i < v.size(); i++) cout << v[i] << " ";
    cout << endl;

    //修改对象 v 中的内容
    for (i = 0; i < v.size(); i++) v[i] = v[i] + v[i];

    //输出对象 v 中的内容
    cout << "Contents doubled:\n";
    for (i = 0; i < v.size(); i++) cout << v[i] << " ";
    cout << endl;

    return 0;
}

运行输出:
size = 0
Current contents:
Size now = 10
0 1 2 3 4 5 6 7 8 9
Size now = 20
Current contents:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Contents doubled:
0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
沙发
 楼主| 发表于 2012-1-11 19:11:17 | 只看该作者
不但可以用下标的方式访问 vector ,还可以用迭代器来访问 vector 对象中的元素。

测试代码
[C++] 纯文本查看 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
        vector<char> v;        //创建一个大小为 0 的 vector 对象
        int i;

        //将值放入 vector 对象中
        for(i = 0; i < 10; i++)
                v.push_back('A' + i);

        
        //使用下标来访问 vector 对象中的内容
        for(i = 0; i < v.size(); i++)
                cout << v[i] << " ";
        cout << endl;

        //使用迭代器来访问 vector 对象中的内容
        vector<char>::iterator p = v.begin();
        while(p != v.end()) {
                cout << *p << " ";
                p++;
        }
        return 0;
}


运行输出:
A B C D E F G H I J
A B C D E F G H I J
迭代器类型是由容器类定义的,因此声明一个特殊容器的迭代器可以使用上面程序中类似的语句:在标识符 iterator 的前面加上容器类的名字。在程序中,通过调用函数 begin() 将变量 p 初始化指向 vector 对象的第一个元素。函数 begin() 返回的是指向 vector 对象中第一个元素的迭代器。我们可以对这个迭代器进行增量运算以便每次访问 vector 对象中的一个元素。这个过程和用指针来访问数组中的元素是类似的。我们可以用 end() 来确定是否已经到达了对象 v 的尾部,该函数返回 vector 对象中最后一个元素的迭代器,也就是说,当变量 p 等于 v.end() 时,就表示到达了 vector 对象的末段。

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
板凳
 楼主| 发表于 2012-1-11 20:52:52 | 只看该作者

在 vector 中插入和删除元素

除了可以在 vector 对象的末端加入一个元素外,也可以用 insert() 函数在中间插入一个元素,也可以用 erase() 函数删除一个元素。

测试代码
[C++] 纯文本查看 复制代码
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<char> v;
    unsigned int i;

    for (i = 0; i < 10; i++)
        v.push_back('A' + i);

    //输出 vector 对象中的初始内容
    cout << "Size = " << v.size() << endl;
    cout << "Original contents:\\n";
    for (i = 0; i < v.size(); i++) cout << v[i] << " ";
    cout << endl << endl;

    vector<char>::iterator p = v.begin();
    
    p += 2;    //指向第 3 个元素

    v.insert(p, 10, 'X');

    //再输出对象中的内容
    cout << "Size after insert = " << v.size() << endl;
    cout << "Contents after insert:\\n";
    for (i = 0; i < v.size(); i++) cout << v[i] << " ";
    cout << endl << endl;

    //删除一般元素
    p = v.begin();    //再次调整迭代器到开始
    p += 2;            //指向第 3 个元素
    v.erase(p, p+10);    //删除接下来的 10 个元素

    //输出删除操作之后对象中的内容
    cout << "Size after erase = " << v.size() << endl;
    cout << "Contents after erase:\\n";
    for (i = 0; i < v.size(); i++) cout << v[i] << " ";
    cout << endl;

    return 0;
}

运行输出:
Size = 10
Original contents:
A B C D E F G H I J

Size after insert = 20
Contents after insert:
A B X X X X X X X X X X C D E F G H I J

Size after erase = 10
Contents after erase:
A B C D E F G H I J
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 00:33 , Processed in 0.069658 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表