C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)

简介: C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)

vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

一、构造函数

#include <iostream>
#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;
}
 
//vector容器构造
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() {
    test01();
    system("pause");
    return 0;
}
 
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100

二、赋值

1.//vector赋值
void test02() {
    vector<int> v1;
    for (int i = 0; i < 10; ++i) {
        v1.push_back(i);
    }
    printVector(v1);
 
    //赋值 operator=
    vector<int> v2;
    v2 = v1;
    printVector(v2);
 
    //assign
    vector<int> v3;
    v3.assign(v1.begin(), v1.end());
    printVector(v3);
 
    //n个elem方式赋值
    vector<int> v4;
    v4.assign(10, 100);
    printVector(v4);
}

三、容器的大小和容量

//vector容器的容量和大小操作
void test03() {
    vector<int> v1;
    for (int i = 0; i < 10; ++i) {
        v1.push_back(i);
    }
    printVector(v1);
    cout << "容量是否为空:" << v1.empty() << endl;
    cout << "容器的容量:" << v1.capacity() << endl;
    cout << "容器的大小:" << v1.size() << endl;
    // 重新指定容器长度,如果指定的比之前长,默认使用0填充
    v1.resize(8);
    printVector(v1);
    // 重新指定容器大小
    v1.resize(12, 5);
    printVector(v1);
}

四、插入和删除

//vector插入和删除
void test04() {
    vector<int> v1;
    //  尾插
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    // 遍历
    printVector(v1);
    // 尾删
    v1.pop_back();
    printVector(v1);
    // 插入
    v1.insert(v1.begin(), 100);
    printVector(v1);
    // 插入n个
    v1.insert(v1.begin(), 2, 1000);
    printVector(v1);
    // 删除
    v1.erase(v1.begin());
    printVector(v1);
    // 清空
    v1.erase(v1.begin(), v1.end());
    v1.clear();
    printVector(v1);
}

五、数据存取

//vector数据存取
void test05() {
    vector<int> v1;
    //  尾插
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    printVector(v1);
    cout << "返回指定索引所指的数据" << v1.at(2) << endl;
    cout << "返回指定索引所指的数据" << v1[2] << endl;
    cout << "返回第一个元素" << v1.front() << endl;
    cout << "返回最后一个元素" << v1.back() << endl;
}

六、互换

 
//vector互换
void test06() {
    vector<int> v1;
    //  尾插
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    vector<int> v2;
    //  尾插
    v2.push_back(40);
    v2.push_back(30);
    v2.push_back(20);
    v2.push_back(10);
    cout << "交换前打印" << endl;
    printVector(v1);
    printVector(v2);
    cout << "交换后打印" << endl;
    v1.swap(v2);
    printVector(v1);
    printVector(v2);
}
 
//vector使用swap收缩内存
void test07() {
    vector<int> v1;
    for (int i = 0; i < 10000; ++i) {
        v1.push_back(i);
    }
    cout << "容器的容量:" << v1.capacity() << endl;
    cout << "容器的大小:" << v1.size() << endl;
    v1.resize(3);//重新指定大小
    cout << "容器的容量:" << v1.capacity() << endl;
    cout << "容器的大小:" << v1.size() << endl;
    vector<int>(v1).swap(v1);//巧用swap收缩内存
    cout << "容器的容量:" << v1.capacity() << endl;
    cout << "容器的大小:" << v1.size() << endl;
}

七、预留空间

//vector预留空间reserve,减少动态扩展容量时的扩展次数
void test08() {
    vector<int> v;
    // 利用reserve预留空间
    v.reserve(100000);
    int num = 0;//统计开辟次数
    int *p = NULL;
    for (int i = 0; i < 100000; ++i) {
        v.push_back(i);
        if (p != &v[0]) {
            p = &v[0];
            num++;
        }
    }
    cout << "num=" << num << endl;
}


1-7全部代码及测试

#include <iostream>
#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;
}
 
//vector容器构造
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);
}
 
//vector赋值
void test02() {
    vector<int> v1;
    for (int i = 0; i < 10; ++i) {
        v1.push_back(i);
    }
    printVector(v1);
 
    //赋值 operator=
    vector<int> v2;
    v2 = v1;
    printVector(v2);
 
    //assign
    vector<int> v3;
    v3.assign(v1.begin(), v1.end());
    printVector(v3);
 
    //n个elem方式赋值
    vector<int> v4;
    v4.assign(10, 100);
    printVector(v4);
}
 
//vector容器的容量和大小操作
void test03() {
    vector<int> v1;
    for (int i = 0; i < 10; ++i) {
        v1.push_back(i);
    }
    printVector(v1);
    cout << "容量是否为空:" << v1.empty() << endl;
    cout << "容器的容量:" << v1.capacity() << endl;
    cout << "容器的大小:" << v1.size() << endl;
    // 重新指定容器长度,如果指定的比之前长,默认使用0填充
    v1.resize(8);
    printVector(v1);
    // 重新指定容器大小
    v1.resize(12, 5);
    printVector(v1);
}
 
//vector插入和删除
void test04() {
    vector<int> v1;
    //  尾插
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    // 遍历
    printVector(v1);
    // 尾删
    v1.pop_back();
    printVector(v1);
    // 插入
    v1.insert(v1.begin(), 100);
    printVector(v1);
    // 插入n个
    v1.insert(v1.begin(), 2, 1000);
    printVector(v1);
    // 删除
    v1.erase(v1.begin());
    printVector(v1);
    // 清空
    v1.erase(v1.begin(), v1.end());
    v1.clear();
    printVector(v1);
}
 
//vector数据存取
void test05() {
    vector<int> v1;
    //  尾插
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    printVector(v1);
    cout << "返回指定索引所指的数据" << v1.at(2) << endl;
    cout << "返回指定索引所指的数据" << v1[2] << endl;
    cout << "返回第一个元素" << v1.front() << endl;
    cout << "返回最后一个元素" << v1.back() << endl;
}
 
//vector互换
void test06() {
    vector<int> v1;
    //  尾插
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    vector<int> v2;
    //  尾插
    v2.push_back(40);
    v2.push_back(30);
    v2.push_back(20);
    v2.push_back(10);
    cout << "交换前打印" << endl;
    printVector(v1);
    printVector(v2);
    cout << "交换后打印" << endl;
    v1.swap(v2);
    printVector(v1);
    printVector(v2);
}
 
//vector使用swap收缩内存
void test07() {
    vector<int> v1;
    for (int i = 0; i < 10000; ++i) {
        v1.push_back(i);
    }
    cout << "容器的容量:" << v1.capacity() << endl;
    cout << "容器的大小:" << v1.size() << endl;
    v1.resize(3);//重新指定大小
    cout << "容器的容量:" << v1.capacity() << endl;
    cout << "容器的大小:" << v1.size() << endl;
    vector<int>(v1).swap(v1);//巧用swap收缩内存
    cout << "容器的容量:" << v1.capacity() << endl;
    cout << "容器的大小:" << v1.size() << endl;
}
 
//vector预留空间reserve,减少动态扩展容量时的扩展次数
void test08() {
    vector<int> v;
    // 利用reserve预留空间
    v.reserve(100000);
    int num = 0;//统计开辟次数
    int *p = NULL;
    for (int i = 0; i < 100000; ++i) {
        v.push_back(i);
        if (p != &v[0]) {
            p = &v[0];
            num++;
        }
    }
    cout << "num=" << num << endl;
}
 
int main() {
    // test01();
    // test02();
    // test03();
    // test04();
    // test05();
    // test06();
    // test07()
    test08();
    system("pause");
    return 0;
}
 

八、使用内置数据类型

#include <iostream>
 
using namespace std;
 
#include <vector>
#include <algorithm>//标准算法头文件
//vector容器存放内置数据类型
void myPrint(int val){
    cout<<val<<endl;
}
void test01() {
    // 创建一个vector容器,数组
    vector<int> v;
 
    //向容器中插入数据
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);
 
    //通过迭代器访问容器中的数据
    //起始迭代器,指向容器中第一个元素
    vector<int>::iterator itBegin = v.begin();
    //结束迭代器 指向容器中最后一个元素的下一个位置
    vector<int>::iterator itEnd = v.end();
 
    //第一种遍历方式
    cout<<"while"<<endl;
    while (itBegin != itEnd) {
        cout << *itBegin << endl;
        itBegin++;
    }
    cout<<endl;
    //第二种方式
    cout<<"for"<<endl;
    for ( vector<int>::iterator it = v.begin();it != v.end();it++){
        cout << *it << endl;
    }
    cout<<"for_each"<<endl;
    //第三种比例方式,利用STL提供遍历算法
    for_each(v.begin(),v.end(),myPrint);
}
 
int main() {
    test01();
    system("pause");
    return 0;
}
 
while
10
20
30
40
50
 
for
10
20
30
40
50
for_each
10
20
30
40
50

九、使用自定义类型

#include <iostream>
 
using namespace std;
 
#include <vector>
#include <algorithm>//标准算法头文件
 
//vector容器存放自定义数据类型
class Person {
public:
    Person(string name, int age) {
        this->m_Name = name;
        this->m_Age = age;
    }
 
    string m_Name;
    int m_Age;
};
 
void myPrint(Person &val) {
    cout << val.m_Name << " " << val.m_Age << endl;
}
 
void test01() {
    // 创建一个vector容器,数组
    vector<Person> v;
 
    //向容器中插入数据
    Person p1("a1", 1);
    Person p2("a2", 2);
    Person p3("a3", 3);
    Person p4("a4", 4);
    Person p5("a5", 5);
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);
    v.push_back(p5);
 
    for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
        cout << it->m_Name << " " << it->m_Age << endl;
    }
}
 
//存放数据指针
void test02() {
    // 创建一个vector容器,数组
    vector<Person *> v;
 
    //向容器中插入数据
    Person p1("a1", 1);
    Person p2("a2", 2);
    Person p3("a3", 3);
    Person p4("a4", 4);
    Person p5("a5", 5);
    v.push_back(&p1);
    v.push_back(&p2);
    v.push_back(&p3);
    v.push_back(&p4);
    v.push_back(&p5);
 
 
    for (vector<Person *>::iterator it = v.begin(); it != v.end(); it++) {
        cout << (*it)->m_Name << " " << (*it)->m_Age << endl;
    }
 
}
 
int main() {
//    test01();
    test02();
    system("pause");
    return 0;
}
 
a1 1
a2 2
a3 3
a4 4
a5 5

十、容器嵌套

#include <iostream>
#include<vector>
 
using namespace std;
 
//容器嵌套容器
void test01() {
    vector<vector<int>> v;
//    创建子容器
    vector<int> v1;
    vector<int> v2;
    vector<int> v3;
    vector<int> v4;
 
    //向小容器中添加数据
    for (int i = 0; i < 4; ++i) {
        v1.push_back(i + 1);
        v2.push_back(i + 2);
        v3.push_back(i + 3);
        v4.push_back(i + 4);
    }
 
    v.push_back(v1);
    v.push_back(v2);
    v.push_back(v3);
    v.push_back(v4);
 
    for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) {
        for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) {
            cout << *vit << " ";
        }
        cout<<endl;
    }
}
 
int main() {
    test01();
    system("pause");
    return 0;
}
 
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7

相关文章
|
1月前
|
C++ 容器
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
25 5
|
1月前
|
C++ 容器
【C++航海王:追寻罗杰的编程之路】关于空间配置器你知道多少?
【C++航海王:追寻罗杰的编程之路】关于空间配置器你知道多少?
25 2
|
1月前
|
存储 C++ 索引
|
30天前
|
PHP C++ Python
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
23 0
|
1月前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
1月前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
34 0
|
1月前
|
存储 缓存 NoSQL
【C++】哈希容器
【C++】哈希容器
|
1月前
|
关系型数据库 C++ 容器
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
26 0
|
10天前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
56 30
|
24天前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)