Bootstrap

c++ vector

1. vector 构造函数

功能描述:
vector 构造函数
函数原型
vector v; // 默认构造函数
vector(n, elem); // 将n个elem拷贝给本身
vector(const vector& v); // 拷贝构造函数
vector(v.begin(), v.end()); // 将v[begin(), end())区间中的元素拷贝给本身

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



void printVector(vector<int> &v) {
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}


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);

    // n个elem方式构造
    vector<int> v3(10, 100);
    printVector(v3);

    // 拷贝构造函数
    vector<int> v4(v3);
    printVector(v4);
}

int main(int argc, char const *argv[]) {
    test01();
    return 0;
}


2. vector 赋值操作

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

// vector 赋值操作
// 函数原型:
// vector& operator=(const vector& x); // 重载等号操作
// assign(const_iterator first, const_iterator last); // 将区间[first, last)赋值给本身
// assign(n, elem) // 将n个elem拷贝赋值给本身

void printVector(vector<int> &v) {
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}


void test01() {
    vector<int> v1;
    for(int i = 0; i < 10; i++) {
        v1.push_back(i);
    }
    printVector(v1);

    // 赋值操作
    vector<int> v2;
    v2 = v1;
    printVector(v2);

    // 区间赋值
    v2.assign(v1.begin(), v1.end() - 5);
    printVector(v2);

    vector<int> v3;
    v3.assign(v2.begin(), v2.end() - 2);
    printVector(v3);

    // n赋值
    v3.assign(10, 100);
    printVector(v3);
}

int main(int argc, char const *argv[]) {
    test01();
    return 0;
}


3 vector 容量和大小

函数原型:

emty(); // 判断容器是否为空
capacity(); // 容器的容量
size(); // 容器中存放数据的个数
resize(int num); // 重新指定容器的长度,如果指定的长度比原来长,则以默认值填充新位置。如果指定的长度比原来短,则末尾超出容器长度的元素被删除。
resize(int num, int val); // 重新指定容器的长度,如果指定的长度比原来长,则以指定的值填充新位置。如果指定的长度比原来短,则末尾超出容器长度的元素被删除。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

void printVector(vector<int> &v) {
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void isEmpty(vector<int> &v) {
    if (v.empty())  
    {
       cout << "v is empty" << endl;
    }
    else{
        cout << "v is not empty" << endl;
    }
}

void test01() {
    vector <int> v;
    
    isEmpty(v);
    cout << "v.size() = " << v.size() << endl; // 默认是0
    cout << "v.capacity() = " << v.capacity() << endl; // 默认是0

    cout << "-------------------" << endl;
    // 添加数据
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }
    printVector(v);
    isEmpty(v);
    cout << "v.size() = " << v.size() << endl; //
    cout << "v.capacity() = " << v.capacity() << endl; // 
    
    cout << "-------------------" << endl;
    // 重新指定容器的长度
    v.resize(15,100); 
    printVector(v); // 如果指定的长度比原来长,则以指定的值填充新位置。
    cout << "v.size() = " << v.size() << endl; // 存放的数据变多
    cout << "v.capacity() = " << v.capacity() << endl; // 容器大小不变

    cout << "-------------------" << endl;
    // 重新指定短了
    v.resize(5);
    printVector(v); // 如果指定的长度比原来短,则末尾超出容器长度的元素被删除。
    cout << "v.size() = " << v.size() << endl; // 存放的数据变少
    cout << "v.capacity() = " << v.capacity() << endl; // 容器大小不变


}

int main(int argc, char const *argv[]) {
    test01();
    return 0;
}




4. vector 插入和删除

函数原型

push_back(const T& x);   // 在容器尾部添加元素
pop_back();              // 删除容器最后一个元素
insert(const_iterator pos, const T& x);  // 在pos位置插入元素x
insert(const_iterator pos, const T& x, int n);  // 在pos位置插入n个元素x
erase(const_iterator pos);  // 删除pos位置的元素
erase(const_iterator start, const_iterator end); // 删除从start到end的元素
clear();  // 删除容器中所有元素
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

void printVector(vector<int> &v){
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
}

void test01() {
    vector<int> v;
    // 尾插
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);
    printVector(v);
    // 尾删
    v.pop_back();
    printVector(v);
    // 插入 第一个参数是迭代器,第二个参数是插入的元素
    v.insert(v.begin(), 100); // 在头部插入
    printVector(v);
    // 插入 n 个元素
    v.insert(v.begin(), 2, 1000);
    printVector(v);
    // 删除
    v.erase(v.begin());
    printVector(v);
    // 删除区间
    v.erase(v.begin(), v.begin() + 2);
    printVector(v);
    // 清空
    cout << "clear" << endl;
    v.clear();
    printVector(v);
    cout << "size: " << v.size() << endl;
    cout << "capacity: " << v.capacity() << endl;
}

int main(int argc, char const *argv[]) {
    test01();
    return 0;
}

5 vector 数据存取

函数原型

at(int pos) // 返回索引为pos的数据
operator[](int pos) // 返回索引为pos的数据
front() // 返回容器中第一个数据元素
back() // 返回容器中最后一个数据元素
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

// vector 数据存取

void test01() {
    vector<int> v;
    for (int i = 0; i < 10; i++) {
        v.push_back(i);
    }
    // at()
    for(int i = 0; i < v.size(); i++) {
        cout << v.at(i) << " ";
    }
    cout << endl;
    // operator[]
    for (int i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;

    cout << "front: " << v.front() << endl;
    cout << "back: " << v.back() << endl;
}

int main(int argc, char const *argv[]) {
    test01();
    return 0;
}


6. vector 互换容器

// 函数原型

 swap(vec); // 交换两个容器的所有元素
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

// vector 互换容器
void printVec(vector<int> &v) {
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
}

// 基本使用
void test01() {
    vector<int> v1;
    cout << "交换前" << endl;
    for (size_t i = 0; i < 5; i++)
    {
        v1.push_back(i);
    }
    printVec(v1);

    vector<int> v2;
    for (size_t i = 10; i > 0; i--)
    {
       v2.push_back(i);
    }
    printVec(v2);
    
    cout << "交换后" << endl;
    v1.swap(v2);
    printVec(v1);
    printVec(v2);
    
}

// 实际用途
// 巧用swap可以收缩内存空间
void test02() {
    vector<int> v;
    for(int i = 0; i < 100000; i++) {
        v.push_back(i);
    }
    cout << "v的容量为:" << v.capacity() << endl;
    cout << "v的大小为:" << v.size() << endl;

    v.resize(3);
    cout << "v的容量为:" << v.capacity() << endl;
    cout << "v的大小为:" << v.size() << endl;

    // 收缩内存空间
    vector<int>(v).swap(v); // 匿名对象 当前行执行完毕,立即释放匿名对象
    cout << "v的容量为:" << v.capacity() << endl;
    cout << "v的大小为:" << v.size() << endl;

}

int main(int argc, char const *argv[]) {
    test02();
    return 0;
}


7 vector 预留空间

功能描述:减少vector 在动态扩展容量时的扩展次数

函数原型

resever(int len) // 预留len个长度,不初始化元素,不可访问
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

//  vector 预留空间

void printVec(vector<int> &v) {
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
}

void test01() {
    vector<int> v;
    // v.reserve(100000); // 预留100000个空间,不初始化元素,不可访问
    int num = 0; // 统计vector扩容的次数
    int *p = NULL;
    for (int i = 0; i < 100000; i++)
    {
        v.push_back(i);
        if(p != &v[0]){
            p = &v[0];
            num++;
            cout << "capacity = " << v.capacity() << endl;
            cout << "size = " << v.size() << endl;
        }
    }
    cout << "num = " << num << endl
}

int main(int argc, char const *argv[]) {
    test01();
    return 0;
}


;