近期,我学习了有关C++及其STL容器的有关知识,在此做了做总结。今天我先简要介绍一下什么是“容器”,有什么作用,以及vector容器的基本用法。我是一名初学者,或许只能浅显的介绍一些容器的基本成员函数的用法,并配上例子,不作原理的剖析。
目录
- 什么是C++容器,有什么作用?
- 有哪些C++的STL容器
- vector的简介及常用函数
- 代码示例
一、什么是C++容器,有什么作用?
所谓“容器”,顾名思义,就是一个模板或一种“介质”,用于存放各种类型的数据,如基本类型的变量或者对象等。容器大大方便了我们处理各种数据结构,而且它最重要的优点就是可以自己扩展自己的大小,这是普通的数组无法做到的。
谈到C++容器,就不可避免地要介绍STL:何为STL?STL是C++标准模板库(Standard Template Library),是目前C++内置支持的库,它的底层利用了C++类模板和函数模板的机制。STL是C++语言标准库之一,C++标准库还包括C语言标准库,IO流库,本地化库和其他。而容器又是STL的重要组成部分,STL包括容器 container,算法 algorthm,迭代器 iterator,仿函数 function object,适配器 adaptor,空间配置器 allocator等六大组件。
二、常见的STL容器
- 顺序容器:
vector 向量
deque 双端队列
list 链表
string 字符串
- 关联容器:
set 集合
multiset 多重集合
map 映射
multimap 多重映射
pair类型
- 适配器容器:
stack 栈容器
queue 队列容器
priority_queue 优先级队列容器
三、Vector的简介及基本用法
Vector是向量容器,可以将元素放到动态数组中加以管理。它能从末尾快速地插入与删除元素,支持快速的随机访问元素,也就是说可以通过变址运算符[ ]或at函数访问向量中的任意元素,vector是所有容器中比较灵活的一种。特点:地址不变,内存空间连续,所以在中间进行插入和删除时会造成内存块拷贝,如果插入的是结构体或者类,则会造成构造和析构,性能不是特别高,对结尾元素操作最快。
1.初始化
在C++中使用Vector,应先导入vector库,使用标准命名空间。即:
#include<vector>
using namespace std;
创建向量的示例:
vector<int>a0; //创建空向量a0
vector<int>a1(5); //a1有5个元素,每个数的值都是默认值为0
vector<int>a2(7,2); //a2有7个元素,每个数的值都是2
vector<int>a3{6}; //a3有1个元素6
vector<int>a4(a0.begin(), a0.begin()+5);//利用a0的迭代器创建向量a4
vector<int>a5=a6; //或vector<int>a5(a6);创建a5,并将a6中的值拷贝到a5
一般还可以用assign()函数为向量赋值,assign()函数有一下3种用法:
assign(Iter1,Iter2) | 由现有向量的两个迭代器截取值,并赋值给新向量 |
assign(n,val) | 以n个值val赋值给新向量 |
assign(array) | 以一个数组赋值给新向量 |
2.元素的添加与删除
push_back(elem) | 在向量末尾添加元素elem(进栈) |
pop_back() | 删除最后一个元素(出栈) |
erase(iter)或erase(iter1,iter2) | 删除向量中某个迭代器或者迭代器区间中的元素 |
insert(pos,elem) | 在pos位置插入元素elem |
clear() | 清空向量中所有元素 |
代码示例:
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
vector<int>a;
vector<int>::iterator q;//创建迭代器
for(int y=1;y<=5;++y)
{
a.push_back(y);
}
//此时a为{1,2,3,4,5}
a.pop_back();
//此时a为{1,2,3,4}
a.erase(a.begin()+1);
//a为{1,3,4}
a.insert(a.begin()+1,2);
//a为{1,2,3,4}
return 0;
}
3.迭代器与元素的访问,遍历
[ ]运算符 | 使用[ ]运算符可访问任意成员,一般不会抛出异常 |
at(index) | 访问索引为index的成员,会抛出越界异常 |
vector<int>::iterator Iter | 创建迭代器Iter(迭代器就是一种特殊的指针) |
begin() | 返回首元素迭代器 |
end() | 返回尾元素后一个位置的迭代器 |
rbegin() | 返回首元素的逆迭代器 |
rend() | 返回尾元素的逆迭代器 |
front() | 获取当前向量容器的第一个元素 |
back() | 获取当前向量容器的最后一个元素 |
代码示例:
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
vector<int>a;
vector<int>::iterator q;//创建迭代器
for(int y=1;y<=5;++y)
{
a.push_back(y);
}
//此时a为{1,2,3,4,5}
printf("%d\n",a.front());//1
printf("%d\n",a.back());//5
printf("%d\n",a.at(1));//2
printf("%d\n",a[2]);//3
for(q=a.begin();q<a.end();++q)
{
printf("-%d",*q);
}
//-1-2-3-4-5
return 0;
}
4.有关容量与数量的函数
empty() | 判断当前向量容器是否为空 |
size() | 返回当前向量容器中的实际元素个数 |
capacity() | 返回在重新进行内存分配以前所能容纳的元素个数 |
resize(n) | 调整当前向量容器的大小,使其能容纳n个元素 |
reserve(n) | 为当前向量预分配n个元素的存储空间 |
max_size() | 返回向量可储存的最多元素个数(上限) |
C++容器方面的知识可能比较复杂,但不难理解,我相信只要认真学习,多写代码多试验,就一定能掌握它!