C++ vector所有操作,你真的掌握vector了吗?两万总结带你干穿vector

📋 前言

  • 🖱 博客主页:在下马农的碎碎念
  • ✍ 本文由在下马农原创,首发于CSDN
  • 📆 首发时间:2022/01/02
  • 📅 最近更新时间:2022/01/02
  • 🤵 此马非凡马,房星本是星。向前敲瘦骨,犹自带铜声。
  • 📇 系列文章目录: 暂无
  • 🙏作者水平有限,如发现错误,请留言轰炸哦!万分感谢!
  • 🤗码字不易 欢迎关注🔎点赞👍收藏⭐️留言📝

在这里插入图片描述

五岁时,妈妈告诉我,人生的关键在于快乐。上学后,人们问我长大了要做什么,我写下“快乐”。他们告诉我,我理解错了题目,我告诉他们,他们理解错了人生。——约翰·列侬

在这里插入图片描述

以下是正文

1、Vector介绍

Vector是一种可以改变长度的序列化容器。
与数组相同的是Vector也使用一段连续的内存空间来存储元素,因此Vector的元素也可以使用与数组类似的下标来访问。
但是,不同于数组,Vector的大小是可以动态改变的,当我们向容器中添加或删除元素时,容器会自动改变大小。
Vector是C++ 标准模板库的一部分,因此,想要使用Vector,需要在程序中包含头文件vector

#include<vector>

2、Vector定义和初始化

格式:
包含头文件vector之后,我们可以使用下边的格式定义vector:

std::vector<object_type> variable_name;

object_type规定了vector中可以存放哪种类型的元素。
variable_name为vector名。

方式: 定义Vector的常用方式如下所示:

vector<Type> v1; 				//v1是一个空vector,可存储元素类型为T,执行默认初始化
vector<Type> v2(v1);			//v2中包含v1中的所有元素
vector<Type> v2 = v1;			//等价于v2(v1)
vector<Type> v3(n.value);		//v3中有n个元素,并且值都为value
vector<Type> v4(n);				//v4包含了n个重复执行了值初始化的对象
vector<Type> v5{a,b,c.....};	//v5包含大括号中的所有元素
vector<Type> v6 = {a,b,c...}//等价于v5{a,b,c....}

❗❗❗ 注:最常用的方式是先定义一个空的vector,在需要的时候再一一向vector中添加元素

💻示例代码💻

#include <vector>
using std::vector;
int main() {
    vector<int> vector1;			// vector1保存int类型对象
    vector<vector<int>> vector2;	// vector2保存vector类型对象
    // vector<ClassType> vector3	// vector3保存自定义类型ClassType类型对象
}

上边的例子中,创建了几个存储不同元素类型的空vector,vector定义时不需要指定长度。

3、Vector的迭代器

vector中的迭代器包括以下几个,分别为:

  • vector.begin():指向vector首元素的迭代器
  • vector.end():指向vector尾元素下一个位置的迭代器
  • vector.rbegin():指向vector尾元素的反向迭代器,即rbegin()指向尾元素,rbegin-1指向倒数第二个元素
  • vector.rend():指向vector头元素前一个位置的反向迭代器,即rend()指向头元素前一个位置元素,rbegin-1指向第一个元素
  • vector.cbegin():指向vector首元素的迭代器
  • vector.cend():指向vector尾元素下一个位置的迭代器
  • vector.crbegin():指向vector尾元素的反向迭代器
  • vector.crend():指向vector头元素前一个位置的反向迭代器
    专门画了一张示意图,清晰展示各个迭代器:

vector迭代器

代码示例如下:

💻示例代码💻

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化vector为1-4
    for (int i = 1; i <= 4; i++) {
        test.push_back(i);
    }

    cout << "初始化后vector为: ";
    for (auto num : test) {
        cout << num << " ";
    }
    cout << endl;

    // vector.begin()为指向vector头元素的迭代器
    vector<int>::iterator begin_iterator = test.begin();
    cout << "begin() 指向的元素:" << *begin_iterator << endl;

    // vector.end()为指向vector尾元素后一个位置的迭代器,则test.end()-1指向尾元素
    auto end_iterator = test.end();
    cout << "end()-1 指向的元素:" << *(end_iterator - 1) << endl;

    // vector.rbegin()为指向尾元素的迭代器,即反向(r)的头(begin)迭代器
    auto rbegin_iterator = test.rbegin();
    cout << "rbegin() 指向的元素:" << *rbegin_iterator << endl;

    // vector.rend()为指向头元素的前一个位置的迭代器,即反向(r)尾(end)迭代器,则test.rend()-1指向头元素
    auto rend_iterator = test.rend();
    cout << "rend()-1 指向的元素:" << *(rend_iterator - 1) << endl;

    // vector.cbegin()为指向vector头元素的const迭代器,与begin()不同的是返回迭代器类型为vector<int>::const_iterator
    vector<int>::const_iterator cbegin_iterator = test.cbegin();
    cout << "cbegin() 指向的元素:" << *cbegin_iterator << endl;

    // vector.cend()为指向vector尾元素下一个位置的const迭代器,与end()不同的是返回迭代器类型为vector<int>::const_iterator
    vector<int>::const_iterator cend_iterator = test.cend();
    cout << "cend()-1 指向的元素:" << *(cend_iterator-1) << endl;

    // vector.crbegin()为指向尾元素的const迭代器,即反向(r)的const(c)头(begin)迭代器
    auto crbegin_iterator = test.crbegin();
    cout<<"crbegin() 指向的元素: "<< *crbegin_iterator<<endl;

    // vector.crend()为指向头元素下一个位置的const迭代器,即反向(r)的const(c)尾(end)迭代器
    auto crend_iterator = test.crend();
    cout<<"crend()-1 指向的元素: " << *(crend_iterator-1)<<endl;

    return 0;
}

📄输出📄

初始化后vector为: 1 2 3 4
begin() 指向的元素:1
end()-1 指向的元素:4
rbegin() 指向的元素:4
rend()-1 指向的元素:1
cbegin() 指向的元素:1
cend()-1 指向的元素:4
crbegin() 指向的元素: 4
crend()-1 指向的元素: 1

4、Vector大小(容量)相关方法

4.1 size()——元素个数

要想知道vector中有多少元素,使用vector.size()方法,作用是返回Vector中元素的个数。示例如下:

💻示例代码💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test
    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }
    cout << "初始化后的test为:";
    for (auto num : test) {
        cout<<num<<" ";
    }
    int sizeOftest = test.size();
    cout<<"\ntest中的元素个数为:"<< sizeOftest;    
}

📄输出📄

初始化后的test为:1 2 3 4 5
test中的元素个数为:5

4.2 max_size()——最多能容纳元素个数:

要想知道vector最多可以有多少元素,使用vector.max_size()方法,作用是返回Vector中最多能容纳元素个数。示例如下:

💻示例代码💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    int sizeOftest = test.size();
    cout<<"\ntest中最多能容纳的元素个数为:"<< test.max_size();    
}

📄输出📄

test中最多能容纳的元素个数为:4611686018427387903

4.3 resize(n)——改变vector容量为n

如果想要改变vector的size,使用vector.resize(n)方法,将vector的size改为n。示例如下:

💻示例代码💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test
    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }
    cout << "初始化后的test为:";
    for (auto num : test) {
        cout << num << " ";
    }
    int sizeOftest = test.size();
    cout << "\ntest中的元素个数为:" << sizeOftest;

    // resize test 为10
    test.resize(10);

    int sizeAfterResize = test.size();
    cout << "\nresize test后test的元素个数为:" << sizeAfterResize;

    cout << "\nresize()后的test为:";
    for (auto num : test) {
        cout << num << " ";
    }
}

📄输出📄

初始化后的test为:1 2 3 4 5
test中的元素个数为:5
resize test后test的元素个数为:10
resize()后的test为:1 2 3 4 5 0 0 0 0 0

4.4 capacity()——当前分配给vector的容量大小

要想知道当前分配给vector的容量大小,即vector达到多少个元素后会触发扩容,使用vector.capacity()方法,作用是返回当前分配给vector的容量大小。示例如下:

💻示例代码💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test = [1,2,3,4,5,6,7,8,9,10]
    for (int i = 1; i <= 10; i++) {
        test.push_back(i);
        cout << "test中的元素个数为:" << test.size();
        cout << "\ntest当前被分配的容量为:" << test.capacity();
        cout<<"\n==========================================\n";
    }
}

📄输出📄

test中的元素个数为:1
test当前被分配的容量为:1
==========================================
test中的元素个数为:2
test当前被分配的容量为:2
==========================================
test中的元素个数为:3
test当前被分配的容量为:4
==========================================
test中的元素个数为:4
test当前被分配的容量为:4
==========================================
test中的元素个数为:5
test当前被分配的容量为:8
==========================================
test中的元素个数为:6
test当前被分配的容量为:8
==========================================
test中的元素个数为:7
test当前被分配的容量为:8
==========================================
test中的元素个数为:8
test当前被分配的容量为:8
==========================================
test中的元素个数为:9
test当前被分配的容量为:16
==========================================
test中的元素个数为:10
test当前被分配的容量为:16
==========================================

通过每次新增一个元素后观察capacity的变化,可以发现vector当前容量不够容纳新的元素,就会把容量扩大为原来的两倍。

4.5 empty()——检查vector是否为空

想要检查vector是否为空,使用vector.empty()方法,如果为空返回true,否则返回false。示例如下:

💻示例代码💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;

    cout << "添加元素前test.isempty() = " << test.empty();

    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }

    cout << "\n添加元素后test.isempty() = " << test.empty();
}

📄输出📄

添加元素前test.isempty() = 1
添加元素后test.isempty() = 0

4.6 reserve(n)——要求vector至少能容纳n个元素

要求vector至少能容纳n各元素,此时有两种情况,如果此时vector容量小于n,则容量会被扩大到n;如果此时容量大于n,则容量不变。示例如下:

💻示例代码💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 要求test中至少能容纳10个元素
    test.reserve(10);
    cout << "\nreserve后test.size() = " << test.size();
    cout << "\nreserve后test.capacity() = " << test.capacity();

    vector<int> test1;
    // 向test1中添加7个元素,根据前文经验,此时test1元素个数应为7,容量应为8
    for(int i = 1;i<=7;i++) {
        test1.push_back(i);
    }
    cout << "\nreserve前test1.capacity() = " << test1.capacity();
    // 要求test1中至少能容纳4个元素
    test1.reserve(4);
    cout << "\nreserve后test1.capacity() = " << test1.capacity();
}

test没有添加元素,初始容量为0,test.reserve(10)要求test容量至少为10,则test容量被扩大到10;
test1添加了7个元素,容量被扩大到8。test1.reserve(4)要求test容量至少为4,则test容量不变;

📄输出📄

reserve后test.size() = 0
reserve后test.capacity() = 10
reserve前test1.capacity() = 8
reserve后test1.capacity() = 8

4.7 shrink_to_fit()——要求vector减小容量已适应元素个数 【C++11】

让vector尽可能减小容量以适配size,意思就是让capacity缩小到size。示例如下:

💻示例代码💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    for (int i = 1; i <= 9; i++) {
        test.push_back(i);
    }
    cout << "\nshrink_to_fit前test.capacity() = " << test.capacity();
    test.shrink_to_fit();
    cout << "\nshrink_to_fit后test.capacity() = " << test.capacity();
}

📄输出📄

shrink_to_fit前test.capacity() = 16
shrink_to_fit后test.capacity() = 9

5、Vector常用操作

5.1 push_back()——添加元素(vector尾部)

向vector中添加元素,使用push_back()方法,作用是向vector尾部添加一个元素。示例如下:

💻示例代码💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test {1,2,3,4,5};

    cout<<"初始化的Vector: ";
    for(auto num : test) {
        cout<<num<<" ";
    }
    cout<<endl;
    test.push_back(6);				// 向test尾部添加元素6
    test.push_back(7);				// 向test尾部添加元素7
    test.push_back(8);				// 向test尾部添加元素8
    cout<<"添加元素后的Vector: ";
    for(auto num : test) {
        cout<<num<<" ";
    }
    return 0;
}

📄输出📄

初始化的Vector: 1 2 3 4 5
添加元素后的Vector: 1 2 3 4 5 6 7

❗❗注意点❗❗

✅ 可以使用下标访问vector的元素,如使用test[0] 访问test的第一个元素,会得到1
🈲 不可以使用下标添加元素,如当前有8个元素,不可以用test[8] = 9,这种方式添加第九个元素。
📣 使用push_back()方法添加元素最为常用,初次之外,还可以使用insert()方法和emplace()方法

5.2 pop_back()——删除Vector元素

删除vector中的元素,使用pop_back()方法,作用是删除vector尾部的一个元素。示例如下:

💻示例代码💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test {1,2,3,4,5};
    // 初始化后
    cout << "初始化的 Vector: ";
    for (int num : test) {
        cout << num << " ";
    }
    // 删除vector最后一个元素
    test.pop_back();
    // 删除后
    cout << "\n删除元素的 Vector: ";
    for (int num : test) {
        cout << num << " ";
    }

    return 0;
}

📄输出📄

初始化的 Vector: 1 2 3 4 5
删除元素的 Vector: 1 2 3 4

5.3 at()——访问Vector元素

使用元素的索引来访问Vector中的元素,在vector中,可以使用vector.at(index)或者vector[index]访问索引为index的元素,示例代码如下:

💻示例代码💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test {1,2,3,4,5};
    
    cout<< "test索引为0的元素"<< test.at(0) << endl;
    cout<< "test索引为1元素"<< test.at(1) << endl;
    cout<< "test索引为2元素"<< test[2] << endl;
    return 0;
}

📄输出📄

test索引为0的元素1
test索引为1元素2
test索引为2元素3

🔱两种访问方法的优劣🔱
虽然使用 vector.at(index)vector[index]的方式都能访问索引为index的元素,但是,如果此元素不存在,即索引越界时, vector.at(index)会抛出一个异常,但是vector[index]会返回一个垃圾值,因此,最好使用vector.at(index)

5.4 front()和back()——访问Vector头尾元素

front()返回vector第一个元素,back()返回vector最后一个元素

示例如下:

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test为【1,2,3,4,5】
    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }

    cout << "test的第一个元素为:" <<test.front()<< endl;
    cout << "test的最后一个元素为:" <<test.back()<< endl;
}

📄输出📄

test的第一个元素为:1
test的最后一个元素为:5

5.5 assign()——指定Vector元素

assign的作用就是用新的元素替换vector中旧的元素

用法一:vector.assign(num,value)

这种用法会用num个value填充vector,如果操作前vector中有其他元素,会被覆盖掉。示例如下:

💻示例代码💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;
using std::string;


int main() {
    vector<string> test {"dog","cat","rabbit"};

    // 初始化
    cout << "初始化的 Vector: ";
    for (string animal : test) {
        cout << animal << " ";
    }
    // 指定vector元素,2个"sheep"
    test.assign(2,"sheep");
    // 指定元素后
    cout << "\n指定元素的 Vector: ";
    for (string animal : test) {
        cout << animal << " ";
    }
    
    return 0;
}

📄输出📄

初始化的 Vector: dog cat rabbit
指定元素的 Vector: sheep sheep


用法二:vector.assign(iterator1,iterator2)

这种用法会用两个迭代器iterator1和iterator2之间的元素覆盖vector的元素,迭代器可以是原来vector的迭代器,也可以是其他vector的迭代器,注意区间是左闭右开[iterator1,iterator2),即iterator1指向的元素在区间内,iterator2指向的元素不在区间内,iterator2可以是vector.end。

用法三:vector.assign(address1,address2)

这种用法会用两个数组元素地址address1和address2之间的元素覆盖vector的元素,注意区间仍是左闭右开[*address1,*address2),即address1指向的元素在区间内,address2指向的元素不在区间内。用法2和用法3示例如下:

💻示例代码💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;
using std::string;


int main() {
    vector<string> test {"dog","cat","rabbit","pig","fish"};

    // 初始化
    cout << "初始化的 Vector: ";
    for (string animal : test) {
        cout << animal << " ";
    }

    vector<string>::iterator it;
    // begin()返回指向vector第一个元素的迭代器,end()返回指向vector最后一个元素后边一位的迭代器,详细介绍见下文迭代器章节
    it = test.begin();
    // 指定vector元素,it+1指向cat,end-1指向fish"
    // 用[it+1,end-1)之间元素覆盖旧的元素
    test.assign(it+1,test.end()-1);
    // 使用迭代器指定元素后
    cout << "\n使用迭代器指定元素的 Vector: ";
    for (string animal : test) {
        cout << animal << " ";
    }

    // 使用数组元素地址指定vector元素
    string mystrs[] = {"bird","snack","dragon"};
    test.assign(mystrs,mystrs+2);
    cout << "\n使用数组元素地址指定元素的 Vector: ";
    for (string animal : test) {
        cout << animal << " ";
    }
    return 0;
}

📄输出📄

初始化的 Vector: dog cat rabbit pig fish
使用迭代器指定元素的 Vector: cat rabbit pig
使用数组元素地址指定元素的 Vector: bird snack

5.6 insert()——添加元素(任意位置)

向vector中添加元素,使用insert(iterator,value)方法,作用是向iterator迭代器指向元素的前边添加一个元素value。示例如下:

💻示例代码💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;
using std::string;


int main() {
    vector<int> test {1,2,3,4,5};

    // 初始化
    cout << "初始化的 Vector: ";
    for (int num : test) {
        cout << num << " ";
    }

    vector<int>::iterator it;
    // begin返回指向vector第一个元素的迭代器
    it = test.begin();
    
    // it指向vector第一个元素,则把9插入到1之前
    test.insert(it,9);
    
    cout << "\n插入元素后的 Vector: ";
    for (int num : test) {
        cout << num << " ";
    }
    return 0;
}

📄输出📄

初始化的 Vector: 1 2 3 4 5
插入元素后的 Vector: 9 1 2 3 4 5

5.7 erase()——删除元素(任意位置)

erase的作用就是根据传入的迭代器删除vector中的元素,参数为一个迭代器,只删除迭代器指向的元素;参数为两个迭代器,删除两个迭代器之间的元素

1️⃣**用法一:vector.erase(iterator)**1️⃣

这种用法会删除迭代器iterator指向的元素。示例如下:

💻示例代码💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test ;
    // initial vector
    for(int i = 1;i<=8;i++) {
        test.push_back(i);
    }
    // 初始化后的vector:
    cout<<"初始化后的vector: ";
    for(auto num : test) {
        cout<<num<<" ";
    }
    // 使用erase擦除一个元素
    vector<int>::iterator it;
    // test.begin()指向第一个元素,加二后指向第三个元素
    it = test.begin()+2;
    test.erase(it);

    // 擦除元素后的vector:
    cout<< "\n擦除元素后的vector:";
    for(auto num : test) {
        cout<< num << " ";
    }
}

📄输出📄

初始化后的vector: 1 2 3 4 5 6 7 8
擦除元素后的vector:1 2 4 5 6 7 8


2️⃣**用法二:vector.erase(iterator1,iterator2)**2️⃣

这种用法会删除迭代器iterator1指向的元素到iterator2指向元素之间的元素,包括iterator1指向的元素但不包括iterator2指向的元素,即擦除[iterator1,iterator2)。示例如下:

💻示例代码💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test ;
    // initial vector
    for(int i = 1;i<=8;i++) {
        test.push_back(i);
    }
    // 初始化后的vector:
    cout<<"初始化后的vector: ";
    for(auto num : test) {
        cout<<num<<" ";
    }
    // 使用erase擦除一个元素
    vector<int>::iterator it1;
    vector<int>::iterator it2;
    // test.begin()指向第1个元素,加1后指向第2个元素
    it1 = test.begin()+1;
    // test.begin()指向第1个元素,加5后指向第6个元素
    it2 = test.begin()+5;
    test.erase(it1,it2);

    // 擦除元素后的vector:
    cout<< "\n擦除元素后的vector:";
    for(auto num : test) {
        cout<< num << " ";
    }
}

📄输出📄

初始化后的vector: 1 2 3 4 5 6 7 8
擦除元素后的vector:1 6 7 8

5.8 clear()——清空元素

clear的作用就是清空vector中的所有元素

清空vector中所有元素,使用clear()方法。示例如下:

💻示例代码💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test ;
    // initial vector
    for(int i = 1;i<=8;i++) {
        test.push_back(i);
    }
    // 初始化后的vector:
    cout<<"初始化后的vector: ";
    for(auto num : test) {
        cout<<num<<" ";
    }
    // 使用clear清空vector
    test.clear();

    // 清空元素后的vector:
    cout<< "\nvector.size() = "<<test.size();
    cout<< "\n清空元素后的vector:";
    for(auto num : test) {
        cout<< num << " ";
    }
}

📄输出📄

初始化后的vector: 1 2 3 4 5 6 7 8
vector.size() = 0
清空元素后的vector:

5.9 swap()——交换元素

swap的作用就是交换两个vector的元素

交换两个vector的元素,使用swap()方法,vector1.swap(vector2),两个vector存储的元素类型必须相同,元素个数可以不同。示例如下:

💻示例代码💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test1 ;
    vector<int> test2 ;
    // initial vector
    for(int i = 1;i<=8;i++) {
        test1.push_back(i);
    }
    for(int i = 10;i<=14;i++) {
        test2.push_back(i);
    }
    // 初始化后的vector:
    cout<<"初始化后的test1: ";
    for(auto num : test1) {
        cout<<num<<" ";
    }
    cout<<"\n初始化后的test2: ";
    for(auto num : test2) {
        cout<<num<<" ";
    }
    // 使用swap交换test1和test2
    test1.swap(test2);

    // 交换元素后的test1:
    cout<< "\n交换元素后的test1:";
    for(auto num : test1) {
        cout<< num << " ";
    }
    cout<< "\n交换元素后的test2:";
    for(auto num : test2) {
        cout<< num << " ";
    }
}

📄输出📄

初始化后的test1: 1 2 3 4 5 6 7 8
初始化后的test2: 10 11 12 13 14
交换元素后的test1:10 11 12 13 14
交换元素后的test2:1 2 3 4 5 6 7 8

5.10 emplace()——插入元素 【C++11】

向vector中添加元素,使用emplace(iterator,value)方法,作用是向iterator迭代器指向元素的前边添加一个元素value。返回一个迭代器,指向新添加的元素。示例如下:

💻示例代码💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test为【1,2,3,4,5】
    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }

    cout << "初始化后的test为:";
    for (auto num : test) {
        cout << num << " ";
    }

    // 向begin()指向元素之前插入一个元素,返回迭代器it指向新元素
    auto it = test.emplace(test.begin(),100);
    cout << "\n使用emplace在test.begin()前插入元素后的test为:";
    for (auto num : test) {
        cout << num << " ";
    }

    // 在上边插入的新元素100前插入元素
    test.emplace(it,200);
    cout << "\n使用emplace在100前插入元素后的test为:";
    for (auto num : test) {
        cout << num << " ";
    }

    // 在test尾部插入元素,即test.end()的前边
    test.emplace(test.end(),300);
    cout << "\n使用emplace在test.end()前(即test尾部)插入元素后的test为:";
    for (auto num : test) {
        cout << num << " ";
    }
}

📄输出📄

初始化后的test为:1 2 3 4 5
使用emplace在test.begin()前插入元素后的test为:100 1 2 3 4 5
使用emplace在100前插入元素后的test为:200 100 1 2 3 4 5
使用emplace在test.end()前插入元素后的test为:200 100 1 2 3 4 5 300

5.11 emplace_back()——在vector尾部插入元素 【C++11】

向vector中添加元素,使用emplace_back(iterator,value)方法,作用是向vector尾部添加一个元素value。示例如下:

💻示例代码💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test为【1,2,3,4,5】
    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }

    cout << "初始化后的test为:";
    for (auto num : test) {
        cout << num << " ";
    }

    // 向test尾部插入一个元素
    test.emplace_back(100);
    cout << "\n向test尾部插入一个元素后的test为:";
    for (auto num : test) {
        cout << num << " ";
    }
}

📄输出📄

初始化后的test为:1 2 3 4 5
向test尾部插入一个元素后的test为:1 2 3 4 5 100

6、总结

Vector所有方法总结如下:

方法名作用备注
begin()指向vector首元素的迭代器vector<Type>::iterator
end()指向vector尾元素下一个位置的迭代器vector<Type>::iterator
rbegin()指向vector尾元素的反向迭代器,即rbegin()指向尾元素,rbegin-1指向倒数第二个元素vector<Type>::iterator
rend()指向vector头元素前一个位置的反向迭代器,即rend()指向头元素前一个位置元素,rbegin-1指向第一个元素vector<Type>::iterator
cbegin()指向vector头元素的const迭代器,与begin()不同的是返回迭代器类型为vector::const_iteratorvector<Type>::const_iterator
cend()指向vector尾元素下一个位置的const迭代器,与end()不同的是返回迭代器类型为vector::const_iteratorvector<Type>::const_iterator
crbegin()指向尾元素的const迭代器,即反向®的const©头(begin)迭代器vector<Type>::const_iterator
crend()指向头元素下一个位置的const迭代器,即反向®的const©尾(end)迭代器Vector<Type>::const_iterator
size()返回vector中元素个数-
max_size()返回vector中最多能容纳元素个数-
resize(n)改变vector的大小为n如果n比当前vector中元素个数大,则填充默认值
capacity()当前分配给vector的容量大小-
empty()判断vector是否为空-
reserve(n)改变当前vecotr所分配空间的大小capacity为n如果当前capacity大于n,则不变
shrink_to_fit()改变当前vecotr所分配空间的大小为size()-
push_back()在vector的最后添加一个数据-
pop_back()去掉vector的最后一个数据-
at(i)得到编号位置i的数据-
front()得到vector头元素的引用-
back()得到vector的最后一个元素的引用-
assign()用新的元素替换vector中旧的元素-
insert()添加元素(任意位置)-
erase()删除元素(任意位置)-
clear()清空vector中的所有元素-
swap()交换两个vector的元素-
emplace()向vector中添加元素-
emplace_back()在vector尾部插入元素-

结语: 本文详细总结了vector容器的一些方法,包括vector使用,vector初始化,vector迭代器,vector所有操作。
vector begin(); vector end(); vector rbegin(); vector rend(); vector cbegin(); vector cend(); vector crbegin(); vector crend(); vector size(); vector max_size(); vector resize(n);vector capacity(); vector empty(); vector reserve(n); vector shrink_to_fit(); vector push_back(); vector pop_back() ;vector at(i);vector front(); vector back(); vector assign(); vector insert(); vector erase(); vector clear(); vector swap(); vector emplace(); vector emplace_back();
希望大家看完后能对vector的掌握更加深刻。
欢迎关注🔎点赞👍收藏⭐️留言📝

  • 94
    点赞
  • 181
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 70
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 70
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下马农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值