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

相关文章
|
4月前
|
存储 C++ 容器
如何将没有复制或移动构造函数的对象放入vector容器
如何将没有复制或移动构造函数的对象放入vector容器
45 0
|
3月前
|
XML 移动开发 JSON
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
本文介绍了Twaver HTML5中的数据容器(DataBox),包括如何进行增删查改操作、遍历数据容器以及判断网元是否存在于数据容器中。DataBox用于管理所有的网元对象,如ElementBox、LayerBox、AlarmBox等,并通过示例代码展示了其常用方法的使用。
49 1
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
|
4月前
|
C++ 容器
【C++航海王:追寻罗杰的编程之路】关于空间配置器你知道多少?
【C++航海王:追寻罗杰的编程之路】关于空间配置器你知道多少?
36 2
|
4月前
|
PHP C++ Python
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
88 0
|
5月前
|
缓存 Serverless 容器
函数计算操作报错合集之在创建容器时遇到报错,如何处理
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
4月前
|
JavaScript 前端开发 Java
面向对象编程(C++篇2)——构造
面向对象编程(C++篇2)——构造
33 0
|
6月前
|
C++ 容器
C++之评委打分案例(vector与deque容器练习)
C++之评委打分案例(vector与deque容器练习)
|
6月前
|
C++ 容器
C++之deque容器(构造、赋值、大小、插入与删除、存取、排序)
C++之deque容器(构造、赋值、大小、插入与删除、存取、排序)
|
5月前
|
API 开发工具 数据安全/隐私保护
阿里云云效操作报错合集之流水线镜像已经生成,但容器没有出现,是什么导致的
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
5月前
|
敏捷开发 Kubernetes 测试技术
阿里云云效产品使用合集之流水线创建时,不想选择节点和容器,该如何操作
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
下一篇
DataWorks