曲径通幽论坛

标题: vector 类的简单使用 [打印本页]

作者: beyes    时间: 2012-1-11 13:49
标题: vector 类的简单使用
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 << " ";
    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 << " ";
    cout << endl;

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

    //输出对象 v 中的内容
    cout << "Contents doubled:\n";
    for (i = 0; i < v.size(); i++) cout << v << " ";
    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

作者: beyes    时间: 2012-1-11 19:11
不但可以用下标的方式访问 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 << " ";
        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 对象的末段。
作者: beyes    时间: 2012-1-11 20: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 << " ";
    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 << " ";
    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 << " ";
    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





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2