vector容器

vector容器概述

std::vector是C++标准库中的一个动态数组容器,它支持动态调整大小,可以高效地在尾部插入和删除元素。std::vector中的元素在内存中是连续存储的,这使得随机访问元素非常高效,时间复杂度为O(1)。但是,由于内存的连续性,非尾部的插入和删除操作会导致大量数据移动,时间复杂度为O(n)。

区间构造的几种方式

std::vector提供了多种区间构造的方式:

  1. 使用迭代器区间构造

    vector<int>v2(v1.begin(), v1.end());
    • v2使用v1的迭代器区间从begin()end()构造,复制v1中的所有元素。
  2. 使用数组地址构造

    int arr[] = {1, 2, 3, 4, 5};
    vector<int>v3(arr, arr + 5);
    • v3使用数组arr的地址区间从arrarr + 5构造,复制数组中的所有元素。
  3. 使用其他容器的迭代器区间构造

    list<int> lst = {1, 2, 3, 4, 5};
    vector<int>v4(lst.begin(), lst.end());
    • v4使用lst的迭代器区间从begin()end()构造,复制lst中的所有元素。
拷贝构造的几种方式

std::vector提供了多种拷贝构造的方式:

  1. 拷贝构造函数

    vector<int>v4(v3);
    • v4使用v3的拷贝构造函数构造,复制v3中的所有元素。
  2. 使用初始化列表构造

    vector<int>v5 = {1, 2, 3, 4, 5};
    • v5使用初始化列表构造,初始化为列表中的元素。
赋值的几种方式

std::vector提供了多种赋值的方式:

  1. 使用赋值操作符

    v2 = v1;
    • v2使用赋值操作符=v1的元素复制给v2
  2. 使用assign函数

    • 区间赋值

      v3.assign(v1.begin(), v1.end());
      • v3使用assign函数将v1的迭代器区间从begin()end()的元素复制给v3
    • 重复赋值

      v4.assign(10, 100);
      • v4使用assign函数将10个100赋值给v4
empty()函数

empty()函数用于检查vector容器是否为空,如果为空则返回true,否则返回false。这是一个常数时间操作。

if (v1.empty()) {
    cout << "空容器" << endl;
}
检查容量capacity()和大小size()
  • capacity():返回vector容器当前分配的容量,即可以容纳的元素数量。
  • size():返回vector容器中实际存储的元素数量。

容量和大小的区别:

  • 容量capacity()返回的是vector容器当前分配的内存可以容纳的元素数量,即使这些位置尚未被实际使用。
  • 大小size()返回的是vector容器中实际存储的元素数量。
cout << "v1的容量:" << v1.capacity() << endl;
cout << "v1的大小:" << v1.size() << endl;
resize()函数

resize()函数用于改变vector的大小。如果新的大小大于当前大小,vector会用默认值或指定值填充新增的部分;如果新的大小小于当前大小,vector会删除多余的元素。这是一个线性时间操作。

v1.resize(15, 100); // 新增5个元素,值为100
v1.resize(5);      // 删除多余的元素
尾插和尾删
  • 尾插:使用push_back函数在vector的尾部插入一个元素。

    v1.push_back(10);
  • 尾删:使用pop_back函数删除vector尾部的元素。

    v1.pop_back();
在特定位置插入元素
  • 单个元素插入

    v1.insert(v1.begin(), 100); // 在头部插入100
  • 多个相同元素插入

    v1.insert(v1.begin(), 2, 100); // 在头部插入2个100
删除特定元素
  • 删除单个元素

    v1.erase(v1.begin()); // 删除头部元素
  • 删除特定区间

    v1.erase(v1.begin(), v1.end()); // 删除所有元素
at()函数

at()函数用于访问vector中的元素,与operator[]类似,但at()会进行边界检查,如果索引超出范围会抛出out_of_range异常。

int value = v1.at(0); // 访问第一个元素
clear()函数

clear()函数用于清空vector中的所有元素,使size()为0,但保留当前的容量。

v1.clear();

代码逐句解释

#include<iostream>
#include<vector>
#include<string>
using namespace std;

// 打印vector容器中的元素
void printvector(vector<int> &v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

// 测试函数1
void test01() {
    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);

    vector<int>v3(10, 100); // 是10个100
    printvector(v3);

    vector<int>v4(v3); // 拷贝构造(最常用)
    printvector(v4);
}

// 测试函数2
void test02() {
    vector<int>v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }

    vector<int>v2;
    v2 = v1; // 赋值
    printvector(v2);

    vector<int>v3;
    v3.assign(v1.begin(), v1.end()); // assign赋值
    printvector(v3);

    vector<int>v4;
    v4.assign(10, 100); // 赋值10个100
    printvector(v4);

    // 注意赋值和构造的不同
}

// 测试函数3
void test03() {
    vector<int>v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }

    if (v1.empty()) {
        cout << "空容器" << endl;
    }
    printvector(v1);

    cout << "v1的容量:" << v1.capacity() << endl;
    cout << "v1的大小:" << v1.size() << endl;

    // 注意容器和大小的区别
    v1.resize(15, 100); // 重载大
    printvector(v1); // 超出用100填

    v1.resize(5); // 重载小
    printvector(v1); // 多的删
}

// 测试函数4
void test04() {
    vector<int>v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }
    printvector(v1);

    for (int i = 0; i < 9; i++) {
        v1.pop_back(); // 尾删
    }
    printvector(v1);

    v1.insert(v1.begin(), 100); // 在头部插入100
    printvector(v1);

    v1.insert(v1.begin(), 2, 100); // 在头部插入2个100
    printvector(v1);

    v1.erase(v1.begin()); // 删除头部元素
    printvector(v1);

    v1.erase(v1.begin(), v1.end()); // 删除所有元素
    printvector(v1);

    v1.clear(); // 清空容器
    printvector(v1);
}

int main() {
    test04();
    system("pause");
    return 0;
}

详细解释

  1. 包含头文件

    #include<iostream>
    #include<vector>
    #include<string>
    using namespace std;
    • #include<iostream>:包含输入输出流的头文件,用于标准输入输出操作。
    • #include<vector>:包含vector容器的头文件。
    • #include<string>:包含字符串类的头文件,虽然在这个示例中没有直接使用字符串类,但为了完整性还是包含进来。
    • using namespace std;:使用标准命名空间,避免每次调用标准库函数时都要加上std::前缀。
  2. 定义打印函数

    void printvector(vector<int> &v) {
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
            cout << *it << " ";
        }
        cout << endl;
    }
    • void printvector(vector<int> &v):定义一个函数,接收一个vector<int>类型的引用参数。
    • for (vector<int>::iterator it = v.begin(); it != v.end(); it++):使用迭代器遍历vector容器。
    • cout << *it << " ":输出当前迭代器指向的元素值。
    • cout << endl;:输出换行符,结束一行。
  3. 测试函数1

    void test01() {
        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);
    
        vector<int>v3(10, 100); // 是10个100
        printvector(v3);
    
        vector<int>v4(v3); // 拷贝构造(最常用)
        printvector(v4);
    }
    • vector<int>v1;:创建一个空的vector<int>容器。
    • for (int i = 0; i < 10; i++) { v1.push_back(i); }:使用循环向vector容器尾部插入0到9的整数。
    • printvector(v1);:调用打印函数,输出v1中的元素。
    • vector<int>v2(v1.begin(), v1.end());:使用区间构造函数,复制v1中的所有元素到v2
    • printvector(v2);:调用打印函数,输出v2中的元素。
    • vector<int>v3(10, 100);:创建一个包含10个100的vector容器。
    • printvector(v3);:调用打印函数,输出v3中的元素。
    • vector<int>v4(v3);:使用拷贝构造函数,复制v3中的所有元素到v4
    • printvector(v4);:调用打印函数,输出v4中的元素。
  4. 测试函数2

    void test02() {
        vector<int>v1;
        for (int i = 0; i < 10; i++) {
            v1.push_back(i);
        }
    
        vector<int>v2;
        v2 = v1; // 赋值
        printvector(v2);
    
        vector<int>v3;
        v3.assign(v1.begin(), v1.end()); // assign赋值
        printvector(v3);
    
        vector<int>v4;
        v4.assign(10, 100); // 赋值10个100
        printvector(v4);
    
        // 注意赋值和构造的不同
    }
    • vector<int>v1;:创建一个空的vector<int>容器。
    • for (int i = 0; i < 10; i++) { v1.push_back(i); }:使用循环向vector容器尾部插入0到9的整数。
    • vector<int>v2;:创建另一个空的vector<int>容器。
    • v2 = v1;:使用赋值操作符将v1的元素复制给v2
    • printvector(v2);:调用打印函数,输出v2中的元素。
    • vector<int>v3;:创建第三个空的vector<int>容器。
    • v3.assign(v1.begin(), v1.end());:使用assign函数将v1的迭代器区间从begin()end()的元素复制给v3
    • printvector(v3);:调用打印函数,输出v3中的元素。
    • vector<int>v4;:创建第四个空的vector<int>容器。
    • v4.assign(10, 100);:使用assign函数将10个100赋值给v4
    • printvector(v4);:调用打印函数,输出v4中的元素。
  5. 测试函数3

    void test03() {
        vector<int>v1;
        for (int i = 0; i < 10; i++) {
            v1.push_back(i);
        }
    
        if (v1.empty()) {
            cout << "空容器" << endl;
        }
        printvector(v1);
    
        cout << "v1的容量:" << v1.capacity() << endl;
        cout << "v1的大小:" << v1.size() << endl;
    
        // 注意容器和大小的区别
        v1.resize(15, 100); // 重载大
        printvector(v1); // 超出用100填
    
        v1.resize(5); // 重载小
        printvector(v1); // 多的删
    }
    • vector<int>v1;:创建一个空的vector<int>容器。
    • for (int i = 0; i < 10; i++) { v1.push_back(i); }:使用循环向vector容器尾部插入0到9的整数。
    • if (v1.empty()) { cout << "空容器" << endl; }:检查v1是否为空,如果是则输出“空容器”。
    • printvector(v1);:调用打印函数,输出v1中的元素。
    • cout << "v1的容量:" << v1.capacity() << endl;:输出v1的容量。
    • cout << "v1的大小:" << v1.size() << endl;:输出v1的大小。
    • v1.resize(15, 100);:将v1的大小调整为15,新插入的元素值为100。
    • printvector(v1);:调用打印函数,输出调整大小后的v1中的元素。
    • v1.resize(5);:将v1的大小调整为5,删除多余的元素。
    • printvector(v1);:调用打印函数,输出调整大小后的v1中的元素。
  6. 测试函数4

    void test04() {
        vector<int>v1;
        for (int i = 0; i < 10; i++) {
            v1.push_back(i);
        }
        printvector(v1);
    
        for (int i = 0; i < 9; i++) {
            v1.pop_back(); // 尾删
        }
        printvector(v1);
    
        v1.insert(v1.begin(), 100); // 在头部插入100
        printvector(v1);
    
        v1.insert(v1.begin(), 2, 100); // 在头部插入2个100
        printvector(v1);
    
        v1.erase(v1.begin()); // 删除头部元素
        printvector(v1);
    
        v1.erase(v1.begin(), v1.end()); // 删除所有元素
        printvector(v1);
    
        v1.clear(); // 清空容器
        printvector(v1);
    }
    • vector<int>v1;:创建一个空的vector<int>容器。
    • for (int i = 0; i < 10; i++) { v1.push_back(i); }:使用循环向vector容器尾部插入0到9的整数。
    • printvector(v1);:调用打印函数,输出v1中的元素。
    • for (int i = 0; i < 9; i++) { v1.pop_back(); }:使用循环从v1的尾部删除9个元素。
    • printvector(v1);:调用打印函数,输出v1中的元素。
    • v1.insert(v1.begin(), 100);:在v1的头部插入100。
    • printvector(v1);:调用打印函数,输出v1中的元素。
    • v1.insert(v1.begin(), 2, 100);:在v1的头部插入2个100。
    • printvector(v1);:调用打印函数,输出v1中的元素。
    • v1.erase(v1.begin());:删除v1头部的元素。
    • printvector(v1);:调用打印函数,输出v1中的元素。
    • v1.erase(v1.begin(), v1.end());:删除v1中的所有元素。
    • printvector(v1);:调用打印函数,输出v1中的元素。
    • v1.clear();:清空v1中的所有元素。
    • printvector(v1);:调用打印函数,输出v1中的元素。
  7. 主函数

    int main() {
        test04();
        system("pause");
        return 0;
    }
    • test04();:调用测试函数4。
    • system("pause");:暂停程序,等待用户按键。
    • return 0;:返回0,表示程序正常结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值