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++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
4月前
|
算法 编译器 C++
模拟实现c++中的vector模版
模拟实现c++中的vector模版
|
7月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
382 4
|
6月前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
225 0
|
6月前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
163 0
|
7月前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
113 0
|
4月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
16天前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
|
16天前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
|
2月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
91 12