vector及其函数

概念

    Vector 是 C++ 标准模板库(STL)中的一种序列容器,它可以动态地增长和缩小,是基于数组的数据结构,但提供了自动管理内存的能力。这意味着与传统的数组相比,vector 不需要手动分配和释放内存,使其成为 C++ 中非常灵活和功能强大的数据结构

    使用vector需要包含头文件<vector>


vector的基本运用

vector存储类型设定

    请看下面代码,vector容器创建的容器类型是自定义的,存储内容由设定的类型决定

    下方代码中,创建了int型、string型、以及自定义类型的容器用于存储

#include <iostream>
#include <vector>
using namespace std;
//自定义类型
struct point
{
	int a;
	int b;
};
int main()
{
	//创建一个存储int的容器
	vector<int> v1;
	//创建一个存储string的容器
	vector<string> v2;
	//创建一个自定义类型的容器
	vector<point> v3;

	//int容器的录入
	v1.push_back(1);
	v1.push_back(6);

	//string容器的录入
	v2.push_back("hello");
	v2.push_back("world");

	//自定义类型的录入
	point t;
	t.a = 10, t.b = 20;
	v3.push_back(t);

	//打印
	cout << "v1:";
	for (auto i : v1)
	{
		cout << i << " ";
	}
	cout << endl;

	cout << "v2:";
	for (auto i : v2)
	{
		cout << i << " ";
	}
	cout << endl;

	cout << "v3:";
	for (auto i : v3)
	{
		cout << "a:" << i.a << " " << "b:" << i.b;
	}
	cout << endl;

	return 0;
}

上方代码存储后的打印

vector创建方法

    vector的创建格式

    代码演示(相关构建容器上方代码解释:第一行为它对应的格式,第二行等都是代码解释)

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    //explicit vector(const allocator_type & alloc = allocator_type());
    //创建一个空容器
    vector<int> a;

    //explicit vector(size_type n, const value_type & val = value_type(), const allocator_type & alloc = allocator_type());
    //创建n个数量的val元素
    //第一个参数是n,第二个参数是val
    vector<int> b(4, 100);

    /*template <class InputIterator>
    vector(InputIterator first, InputIterator last, const allocator_type & alloc = allocator_type());*/
    //构建一个容器,其初始化数据为设定容器范围内的数据
    //第一个参数为起始位置,第二个参数2为结束位置
    vector<int> c(b.begin(), b.end());

    //vector(const vector & x);
    //复制一个容器
    vector<int> d(c);

    //同上面的c类似,用一个数组设定范围内的值进行初始化
    int s[] = { 1,2,3,4 };
    vector<int> e(s, s + sizeof(s) / sizeof(int));

    cout << "a:";
    for (auto i : a)
    {
        cout << i << " ";
    }
    cout << endl;

    cout << "b:";
    for (auto i : b)
    {
        cout << i << " ";
    }
    cout << endl;

    cout << "c:";
    for (auto i : c)
    {
        cout << i << " ";
    }
    cout << endl;

    cout << "d:";
    for (auto i : d)
    {
        cout << i << " ";
    }
    cout << endl;

    cout << "s:";
    for (auto i : s)
    {
        cout << i << " ";
    }
    cout << endl;

    cout << "e:";
    for (auto i : e)
    {
        cout << i << " ";
    }
    cout << endl;
    return 0;
}

 运行结果:

 


vector成员函数

vector成员函数目录

  • assign():为向量指定新内容,替换其当前内容,并相应地修改其大小
  • pop_back():删除向量中的最后一个元素
  • push_back():在向量的尾部添加一个新元素
  • at():返回对限量中指定位置的元素的引用
  • front():返回对向量中第一个元素的引用
  • back():返回对向量中最后一个元素的引用
  • begin()、end():返回指向向量中首元素( begin() )和尾元素( end() )的迭代器
  • rbegin()、rend():返回一个反向迭代器,该迭代器指向向量中的尾元素( rbegin() )和首元素( rend() )
  • cbegin()、cend():返回指向容器中首元素( cbegin() )和尾元素( cend() )的const_iterator
  • crbegin()、crend():返回指向容器中首元素( crbegin() )和尾元素( crend() )的const_reverse_iterator
  • size():返回当前容器的元素数
  • capacity():返回已分配存储容量的大小
  • max_size():返回向量可以容纳的最大元素数
  • clear():从向量中删除所有元素
  • data():指向向量内部使用的数组中第一个元素的指针
  • insert():指定位置插入元素
  • emplace():通过在指定位置插入新元素来扩展容器
  • emplace_back():在向量的末尾插入一个新元素
  • empty():判断是否为空
  • erase():删除向量元素
  • get_allocator():返回与向量关联的分配器对象的副本
  • operator:重载了运算符,使运算符拥有了相关功能
  • reserve():请求向量容量至少足以包含指定个数的元素
  • resize():调整容器的大小
  • shrink_to_fit():请求容器减小其容量以适应其大小
  • swap():交换容器内容

assign()

    assign()函数作用:为向量指定新内容,替换其当前内容,并相应地修改其大小

assign()函数的格式

代码演示


pop_back()

    pop_back()函数作用:删除向量中的最后一个元素,从而有效地将容器大小减小 1

pop_back()函数的格式

代码演示


push_back()

    push_back()函数作用: 在向量的尾部添加一个新元素,将要插入的元素复制到(或转移)到新元素

(有效的将容器增加了容量,当且仅当新的向量大小超过当前向量容量时,才会自动重新分配分配的存储空间)

push_back()函数的格式

代码演示

#include <iostream>
#include <vector>
using namespace std;
//自定义类型
struct point
{
	int a;
	int b;
};
int main()
{
	//创建一个存储int的容器
	vector<int> v1;
	//创建一个存储string的容器
	vector<string> v2;
	//创建一个自定义类型的容器
	vector<point> v3;

	//int容器的录入
	v1.push_back(1);
	v1.push_back(6);

	//string容器的录入
	v2.push_back("hello");
	v2.push_back("world");

	//自定义类型的录入
	point t;
	t.a = 10, t.b = 20;
	v3.push_back(t);

	//打印
	cout << "v1:";
	for (auto i : v1)
	{
		cout << i << " ";
	}
	cout << endl;

	cout << "v2:";
	for (auto i : v2)
	{
		cout << i << " ";
	}
	cout << endl;

	cout << "v3:";
	for (auto i : v3)
	{
		cout << "a:" << i.a << " " << "b:" << i.b;
	}
	cout << endl;

	return 0;
}

运行结果


at()

    at函数作用:返回对限量中指定位置的元素的引用,与数组的 [ ] 定位元素类似

at函数的格式

代码演示图

    可以看到 a.at(4) 的输出和 a[4] 的输出一样,他们都指向下标为4的位置


front()

    front()函数作用:返回对向量中第一个元素的引用

front()函数的格式

 代码演示


 back()

    back()函数作用:返回对向量中最后一个元素的引用

back()函数的格式

代码演示图


begin()、end()

    begin()、end()函数作用:返回指向向量中首元素( begin() )和尾元素( end() )的迭代器

begin()、end()函数的格式

 代码演示


rbegin()、rend()

    rbegin()、rend()函数作用:返回一个反向迭代器,该迭代器指向向量中的尾元素( rbegin() )和首元素( rend() )

rbegin()、rend()函数的格式

代码演示


cbegin()、cend()

    cbegin()、cend()函数作用:返回指向容器中首元素( cbegin() )和尾元素( cend() )的const_iterator只读迭代器、不可修改的迭代器
    (const_iterator 是指向 const 内容的迭代器。这个迭代器可以增加和减少(除非它本身也是 const),就像 vector::begin 和 vector::end 返回的迭代器一样,但它不能用于修改它指向的内容,即使向量对象本身不是 const)

cbegin()、cend()函数的格式

代码演示


crbegin()、crend()

    crbegin()、crend()函数作用:返回指向容器中首元素( crbegin() )和尾元素( crend() )的const_reverse_iterator(只读的反向迭代器、不可修改的反向迭代器)

crbegin()、crend()函数的格式

代码演示


size()、capacity()、max_size()

    size()函数作用:返回当前容器的元素数

    capacity()函数作用:返回已分配存储容量的大小

     max_size():返回向量可以容纳的最大元素数

size()函数的格式

capacity()函数的格式

max_size()函数的格式

代码演示


clear()

    clear()函数作用:从向量中删除所有元素(已销毁),使容器的大小为 0

clear()函数的格式

代码演示


data()

    data()函数作用:指向向量内部使用的数组中第一个元素的指针
    (如果矢量对象是 const 限定的,则函数返回指向 const value_type的指针。否则,它将返回指向 value_type 的指针)

data()函数的格式

代码演示


 insert()

    insert()函数作用:通过在指定位置的元素之前插入新元素来扩展向量,从而有效地增加容器大小

insert()函数的格式

 代码演示(具体解释请看注释)

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> v(3, 100);
    vector<int>::iterator it;

    cout << "插入前:";
    for (it = v.begin(); it < v.end(); it++)
        cout << ' ' << *it;
    cout << endl;

    it = v.begin();
    //在it位置插入200
    it = v.insert(it, 200);
    cout << "插入后:";
    for (it = v.begin(); it < v.end(); it++)
        cout << ' ' << *it;
    cout << endl;

    //在上面it已经等于v,所以当插入时it代表v的尾部
    //在v的it位置插入2个300
    v.insert(it, 2, 300);
    cout << "插入后:";
    for (it = v.begin(); it < v.end(); it++)
        cout << ' ' << *it;
    cout << endl;

    it = v.begin();
    vector<int> v1(2, 400);
    //在it+2的位置上插入范围从v1的begin位置到end位置的元素
    v.insert(it + 2, v1.begin(), v1.end());
    cout << "插入后:";
    for (it = v.begin(); it < v.end(); it++)
        cout << ' ' << *it;
    cout << endl;

    int v2[] = { 501,502,503 };
    //在v的begin位置插入从v2头元素到v2+3位置的元素
    v.insert(v.begin(), v2, v2 + 3);
    cout << "插入后:";
    for (it = v.begin(); it < v.end(); it++)
        cout << ' ' << *it;
    cout << endl;

    return 0;
}

结果演示


emplace()

    emplace()函数作用:通过在指定位置插入新元素来扩展容器

emplace()函数的格式

代码演示


emplace_back()

    emplace_back()函数作用:在向量的末尾插入一个新元素

emplace_back()函数的格式

代码演示


empty()

    empty()函数作用:判断是否为空

empty()函数的格式

代码演示


erase()

    erase()函数作用:从向量中删除单个元素 (位置) 或一定范围内的元素 ( [first,last))

erase()函数的格式

代码演示


get_allocator()

    get_allocator()函数作用:返回与向量关联的分配器对象的副本

get_allocator()函数的格式

代码演示(相关用法已备注)

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	std::vector<int> v;
	int* p;
	unsigned int i;
	//使用 Vector 的分配器为 5 个元素分配一个带有空间的数组
	p = v.get_allocator().allocate(5);

	//在数组上就地构造值
	for (i = 0; i < 5; i++) v.get_allocator().construct(&p[i], i);

	cout << "分配的数组包含:";
	for (i = 0; i < 5; i++) cout << p[i] << ' ';
	cout << endl;

	//销毁和解除分配
	for (i = 0; i < 5; i++) v.get_allocator().destroy(&p[i]);
	v.get_allocator().deallocate(p, 5);

	return 0;
}


代码结果


operator

    operator作用:重载了运算符,使运算符拥有了相关功能

operator的格式

相关解释

operator[ ]重载了 [ ] ,使容器能返回对向量容器中指定位置处的元素的引用

operator=重载了 = ,使容器能将新内容分配给容器,替换其当前内容,并相应地修改其大小


reserve() 

    reserve()函数作用:请求向量容量至少足以包含指定个数(设定为n)的元素。

    如果 n 大于当前向量容量,则该函数会导致容器重新分配其存储,将其容量增加到 n(或更大)

    在所有其他情况下,函数调用不会导致重新分配,并且向量容量不受影响。

reserve()函数的格式

代码演示

  代码结果展示

    结合下面的代码,我们可以看到vector在插入时,空间量可能会动态分配的,而不是始终确定某个容量值

    而reserve是提前设定好指定数量元素的容量

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int>::size_type sz;

    vector<int> v1;
    sz = v1.capacity();
    cout << "下面是容器正常容量增长:" << endl;
    for (int i = 0; i < 100; ++i) {
        v1.push_back(i);
        if (sz != v1.capacity()) {
            sz = v1.capacity();
            cout << "容量大小: " << sz << endl;
        }
    }

    vector<int> v2;
    sz = v2.capacity();
    v2.reserve(100);
    cout << "下面为reserve设定后的容量增长:" << endl;
    for (int i = 0; i < 100; ++i) {
        v2.push_back(i);
        if (sz != v2.capacity()) {
            sz = v2.capacity();
            cout << "容量大小: " << sz << '\n';
        }
    }
    return 0;
}

resize()

    resize()函数作用:调整容器的大小,使其包含设定数量(设为n)的元素

    如果 n 小于当前容器大小,则内容将减少到其前 n 个元素,删除超出此部分的元素(并销毁它们)

    如果 n 大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到 n 的大小。如果指定了 val ,则新元素将初始化为 val 的副本,否则,它们将进行值初始化

    如果 n 也大于当前容器容量,则会自动重新分配分配的存储空间

resize()函数的格式

代码演示(代码解释请看备注)

#include <iostream>
#include <vector>
using namespace std;
void Print(vector<int> v)
{
    for (auto i : v)
    {
        cout << i << " ";
    }
    cout << endl;
}
int main()
{
    std::vector<int> v;

    for (int i = 1;i < 10;i++) v.push_back(i);
    cout << "v:";
    Print(v);
    //减少到五个元素
    v.resize(5);
    cout << "v:";
    Print(v);

    //容器内不足设定数量的元素,扩展大小至设定数量,而扩展的元素用设定值填充
    //如下面扩展至8个元素,但容器不够,进行扩展,然后用100进行填充
    v.resize(8, 100);
    cout << "v:";
    Print(v);
    //扩展元素数量至12个,没设定填充值,所以用0填充
    v.resize(12);
    cout << "v:";
    Print(v);

    return 0;
}

运行图:


shrink_to_fit()

    shrink_to_fit()函数作用:请求容器减小其容量以适应其大小

    该请求是非绑定的,容器实现可以自由优化,并留下大于其大小的容量的向量。

    这可能会导致重新分配,但对向量大小没有影响,并且无法更改其元素。

shrink_to_fit()函数的格式

代码演示


swap()

    swap()函数作用:交换容器内容,要求交换容器内容是另一个相同类型的矢量对象。大小可能有所不同

swap()函数的格式

代码演示

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> v1(3, 100);
    vector<int> v2(4, 50);
    cout << "交换前的v1:";
    for (unsigned i = 0; i < v1.size(); i++)
        cout << ' ' << v1[i];
    cout << endl;

    cout << "交换前的v2:";
    for (unsigned i = 0; i < v2.size(); i++)
        cout << ' ' << v2[i];
    cout << endl;

    v1.swap(v2);

    cout << "交换后的v1:";
    for (unsigned i = 0; i < v1.size(); i++)
        cout << ' ' << v1[i];
    cout << endl;

    cout << "交换后的v2:";
    for (unsigned i = 0; i < v2.size(); i++)
        cout << ' ' << v2[i];
    cout << endl;

    return 0;
}

结果演示


到此,我们今天的学习就结束了,感谢观看

\\\\٩( 'ω' )و ////

### C++ `vector` 插入元素方法及其使用实例 #### 使用 `insert` 方法向 `vector` 中插入单个元素 可以利用成员函数 `insert` 向容器中的指定位置之前插入新的元素。下面展示如何在特定迭代器指向的位置前加入单一数值。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> numbers = {10, 20, 40}; auto it = numbers.begin(); // 获取起始位置的迭代器 ++it; // 移动到第二个元素处 numbers.insert(it, 30); // 在当前位置前插入整数30 for (const auto& num : numbers) { std::cout << num << ' '; } } ``` 上述代码将在索引为1的地方(即原序列中值为20的位置)前置插入数字30,最终输出应为:10 30 20 40[^1]。 #### 批量插入多个相同类型的元素 除了单独添加外,还可以通过提供两个参数来重复填充一定数量的新项: ```cpp numbers.insert(numbers.end(), 2, 50); // 这里表示从末端开始追加两次50 ``` 这段程序会连续增加两个50至列表结尾,使得最后的结果变为:10 30 20 40 50 50。 #### 将另一个范围内的所有元素复制并插入当前集合内 当希望把其他容器里的全部组件转移到现有对象里面时,则可采用这种方式操作: ```cpp std::vector<int> moreNumbers{60, 70}; numbers.insert(numbers.end(), moreNumbers.begin(), moreNumbers.end()); // 把moreNumbers的内容附加到numbers后面 ``` 执行此命令之后,整个数组将会变成:10 30 20 40 50 50 60 70。 #### 利用初始化列表进行多元素快速插入 自C++11以来引入了一种简洁的方式来一次性定义一组初始数据,并可以直接用于插入动作之中: ```cpp numbers.insert(numbers.begin(), {80, 90}); // 此举会在最前方依次置入80和90这两个新成员 ``` 这样处理后的完整序列为:80 90 10 30 20 40 50 50 60 70。 以上就是有关于C++标准库中动态数组类模板——`vector` 的几种常见插入方式介绍以及具体实现案例说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值