20. C++ vector容器类

作者: 飞扬code | 来源:发表于2019-04-15 08:07 被阅读42次

    vector 是顺序容器的一种。vector 是可变长的动态数组,支持随机访问迭代器,所有 STL 算法都能对 vector 进行操作。要使用 vector,需要包含头文件 vector。

    在 vector 容器中,根据下标随机访问某个元素的时间是常数,在尾部添加一个元素的时间大多数情况下也是常数,总体来说速度很快。在中间插入或删除元素时,因为要移动多个元素,因此速度较慢,平均花费的时间和容器中的元素个数成正比。

    在 vector 容器中,用一个动态分配的数组来存放元素,因此根据下标访问某个元素的时间是固定的,与元素个数无关。

    vector 容器在实现时,动态分配的存储空间一般都大于存放元素所需的空间。例如,哪怕容器中只有一个元素,也会分配 32 个元素的存储空间。这样做的好处是,在尾部添加一个新元素时不必重新分配空间,直接将新元素写入适当位置即可。在这种情况下,添加新元素的时间也是常数。但是,如果不断添加新元素,多出来的空间就会用完,此时再添加新元素,就不得不重新分配内存空间,把原有内容复制过去后再添加新的元素。碰到这种情况,添加新元素所花的时间就不是常数,而是和数组中的元素个数成正比。

    至于在中间插入或删除元素,必然涉及元素的移动,因此时间不是固定的,而是和元素个数有关。


    vector成员函数.png

    vector 的基本用法:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    template <class T>
    void showVector(const vector <T> & v)
    {   //用于输出vector容器的全部元素的函数模板
        //class也可以写为typename 用来说明 vector <T>::const_iterator 是一个类型
        //在 Visual Studio 中不写也可以
        class vector <T>::const_iterator i;
    
        for (i = v.begin(); i != v.end(); ++i){
            cout << *i << " ";
        }
        cout << endl;
    }
    
    int main()
    {
        int a[5] = { 1, 2, 3, 4, 5 };
        vector <int> v(a, a + 5);  //将数组a的内容放入v
        cout << v.end() - v.begin() << endl;  //两个随机迭代器可以相减,输出:5
        showVector(v);  //输出:1 2 3 4 5
    
        v.insert(v.begin() + 2, 13);  //在 begin()+2 位置插人 13
        showVector(v);  //输出:1 2 13 3 4 5
    
        v.erase(v.begin() + 2);  //删除位于 begin()+2 位置的元素
        showVector(v);  //输出:1 2 3 4 5
    
        vector<int> v2(4, 100);  //v2 有 4 个元素,都是 100
        v2.insert(v2.begin(), v.begin() + 1, v.begin() + 3);  //将v的一段插入v2开头
        showVector(v2);  //输出:v2:2 3 100 100 100 100
    
        v.erase(v.begin() + 1, v.begin() + 3);  //删除 v 上的一个区间,即 [2,3]
        showVector(v);  //输出:1 4 5
    
        return 0;
    }
    
    
    运行结果.png

    vector 可变长的二维数组:

    #include <iostream>
    #include <vector>
    using namespace std;
    int main()
    {   
        vector<vector<int> > v(3); //v有3个元素,每个元素都是vector<int> 容器
        for(int i = 0;i < v.size(); ++i){
            for(int j = 0; j < 4; ++j){
                v[i].push_back(j);
            }
        }
        for(int i = 0;i < v.size(); ++i) {
            for(int j = 0; j < v[i].size(); ++j){
                cout << v[i][j] << " ";
            }
            cout << endl;
        }
        return 0;
    }
    
    运行结果.png

    利用vector模拟用户登录:
    简单测试Demo

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class User
    {
    public:
        User(string u, string w):userName(u),passWord(w){}
        bool operator ==(const User & u);
    
    private:
        string userName;
        string passWord;
    };
    
    bool User::operator ==(const User & u)
    {
        return (userName == u.userName) && (passWord == u.passWord);
    
    }
    
    int main()
    {
        vector<User> v;
        v.push_back(User("哈哈", "123"));
        v.push_back(User("呵呵", "123"));
        v.push_back(User("嘿嘿", "123"));
    
        string uname;
        string pword;
        cin >> uname >> pword;
    
        User u(uname, pword);
    
    
        vector<User>::iterator it;
        for(it = v.begin(); it != v.end(); it++){
        if(u == *it){
            cout << "登陆成功" << endl;
            break;
        }else{
            cout << "登陆失败" << endl;
            break;
        }
    }
    
    
    return 0;
    }
    

    改进版(面向对象方式)

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class User
    {
    public:
        User(string u, string w):userName(u),passWord(w){}
        bool operator ==(const User & u);
    
    private:
        string userName;
        string passWord;
    };
    
    bool User::operator ==(const User & u)
    {
        return (userName == u.userName) && (passWord == u.passWord);
    
    }
    
    class Login{
    public:
        bool login(User & u, vector<User> & v);//判断登陆是否成功
        User input();
    };
    
    User Login::input()
    {
        string uname, pword;
        cin >> uname >> pword;
        User u(uname, pword);
        return u;
    }
    
    bool Login::login(User & u, vector<User> & v)
    {
        vector<User>::iterator it;
        for(it = v.begin(); it != v.end(); it++){
            if(u == *it){
                return true;
            }else{
                return false;
            }
        }
    }
    
    int main()
    {
        vector<User> v;
        v.push_back(User("哈哈", "123"));
        v.push_back(User("呵呵", "123"));
        v.push_back(User("嘿嘿", "123"));
    
        Login l;    
        User u = l.input();
    
        if(l.login(u, v)){
            cout << "登陆成功" << endl;
        }else{
            cout << "登陆失败" << endl;
        }
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:20. C++ vector容器类

        本文链接:https://www.haomeiwen.com/subject/kfrywqtx.html