zoukankan      html  css  js  c++  java
  • c++STL容器之vector容器

    vector和数组非常相似,也称为单端数组。

    vector和普通数组的区别:数组是静态空间,而vector可以动态扩展。

    所谓动态扩展:并不是在原空间后接新空间,而是找到更大的内存空间,然后将原数据拷贝至,然后释放原空间。

    一、vector的构造函数

    • vector<T> v;
    • vector(v.begin(),v.end());
    • vector(n,elem);
    • vector(const vector &vec);
    • #include<iostream>
      #include<vector>
      using namespace std;
      void printVector(vector<int>&v) {
          for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
              cout << *it <<" ";
          }
          cout << endl;
      }
      
      void test() {
          vector<int> v1;
          for (int i = 0; i < 10; i++) {
              v1.push_back(i);
          }
          printVector(v1);
          vector<int> v2(v1.begin(), v1.end());
          printVector(v2);
          //n个elem
          vector<int> v3(4,3);//4个3构成
          printVector(v3);
          //拷贝构造
          vector<int> v4(v3);
          printVector(v4);
      }
      
      int main() {
          test();
          system("pause");
          return 0;
      }

    二、vector的赋值操作

    void test() {
        vector<int> v1;
        v1 = { 1, 2, 3, 4 };
        printVector(v1);
        vector<int> v2;
        v2 = v1;
        printVector(v2);
        vector<int> v3;
        v3.assign(v2.begin(), v2.end());
        printVector(v3);
        vector<int> v4;
        v4.assign(4, 3);
        printVector(v4);
    }

    三、vector容器的容量和大小

    void test() {
        vector<int> v1;
        v1 = { 1, 2, 3, 4 };
        cout << v1.empty() << endl;//是否为空
        cout << v1.capacity() << endl;//容量
        cout << v1.size() << endl;//大小
        v1.push_back(5);
        v1.push_back(6);
        v1.push_back(7);
        v1.push_back(8);
        cout << v1.capacity() << endl;//容量
        cout << v1.size() << endl;//大小
        //如果指定得过长,默认会用0填充,可以指定使用值填充
        //如果指定得过短,会删除超出的部分
        v1.resize(10,3);
        printVector(v1);
    }

    四、vector的插入和删除

    push_back()//尾部插入元素
    pop_back()//尾部删除元素
    //注意pos、start、end参数是一个迭代器
    insert(pos,ele)//向指定的索引位置插入元素
    insert(pos,n,ele)//向指定的索引位置插入n个元素
    erase(pos)//删除指定索引的元素
    erase(start,end)//删除start到end之间的元素
    clear()//清空容器
    void test() {
        vector<int> v1;
        v1 = { 1, 2, 3, 4 };
        v1.push_back(5);
        v1.push_back(6);
        v1.push_back(7);
        v1.push_back(8);
        printVector(v1);
        v1.insert(v1.begin(), 1);
        v1.insert(v1.begin()+1, 1);
        v1.erase(v1.begin());
        v1.erase(v1.begin(),v1.begin()+3);
        printVector(v1);
        v1.clear();
    }

    五、vector数据存取

    void test() {
        vector<int> v1;
        v1 = { 1, 2, 3, 4 };
        cout << v1[0] << endl;
        cout << v1.at(0) << endl;
        v1[0] = 5;
        v1.at(0) = 6;
        cout << v1.front() << endl;//第一个元素
        cout << v1.back() << endl;//最后一个元素
    }

    六、vector互换容器

    #include<iostream>
    #include<vector>
    using namespace std;
    void printVector(vector<int>&v) {
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
            cout << *it <<" ";
        }
        cout << endl;
    }
    
    void test() {
        vector<int> v1;
        vector<int> v2;
        for (int i = 0; i< 10; i++) {
            v1.push_back(i);
        }
        for (int i = 10; i > 0; i--) {
            v2.push_back(i);
        }
        cout << "交换前:" << endl;
        printVector(v1);
        printVector(v2);
        cout << "交换后:" << endl;
        v1.swap(v2);
        printVector(v1);
        printVector(v2);
        //实际用途,巧用swap可以收缩内存空间
    }
    void test2(){
        vector<int> v1;
        for (int i = 0; i < 100000; i++) {
            v1.push_back(i);
        }
        cout << "v1的容量为:" << v1.capacity() << endl;
        cout << "v1的大小为:" << v1.size() << endl;
        v1.resize(3);
        //在重新resize之后,容量还是那么多,就造成了浪费
        cout << "v1的容量为:" << v1.capacity() << endl;
        cout << "v1的大小为:" << v1.size() << endl;
        //减少容量
        //vector<int>(v1)为匿名对象,用v1的容量和大小初始化化该匿名对象,然后将该对象的大小和容量
        //重新交换给v1
        vector<int>(v1).swap(v1);
        cout << "v1的容量为:" << v1.capacity() << endl;
        cout << "v1的大小为:" << v1.size() << endl;
    }
    
    int main() {
        test2();
        system("pause");
        return 0;
    }

    输出:

    七、vector预留空间

    减少vector在动态扩展容量时的扩展次数

    函数原型:reverse(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问

    #include<iostream>
    #include<vector>
    using namespace std;
    void printVector(vector<int>&v) {
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
            cout << *it <<" ";
        }
        cout << endl;
    }
    
    void test() {
        vector<int> v1;
        v1.reserve(100000);
        int num = 0;
        int* p = NULL;
        for (int i = 0; i < 100000; i++) {
            //记录容量扩充的次数
            v1.push_back(i);
            if (p != &v1[0]) {
                p = &v1[0];
                num++;
            }
        }
        //原本需要扩展30次
        //利用reserve之后,只需要扩展一次
        cout << "num=" << num << endl;
        
    }
    int main() {
        test();
        system("pause");
        return 0;
    }
  • 相关阅读:
    一句话评论设计模式六大原则
    keystore和truststore
    对于纯Java项目,JVM 各个类加载器的加载目标是什么?
    Keytool 使用总结
    饥饿的消费者(Hungry Consumer)模型
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted c
    如何判断对象已死?
    JMX 管理
    通过 jstat gcutil 来学习JVM 内存分配策略与 GC 发生时机
    程序员也应该有点艺术范儿,不要把“老年代”叫成“Old Generation”
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12111530.html
Copyright © 2011-2022 走看看