03.28_111期_C++_vector特性和使用

如果写出vector这个类的时候不用缺省值,也不用初始化列表

那么可以编写如下构造函数,利用半缺省参数给没有初始化的vector实例进行赋空

但如果存在下面这两句话的设计

template <class InputIterator>

vector(InputIterator first, InputIterator last)

则在调用的时候,写下后面的代码:vector<int> v1(10, 1);

将不会调用vector(size_t n, const T& val = T())

因为还要对10进行类型转换,

编译器去找的时候会去找vector(InputIterator first, InputIterator last)

作为更匹配的构造函数,因为其类型更匹配

所以实际上C++标准库中将这种构造函数设计成

vector(size_t n, const T& val = T());

vector(int n, const T& val = T()); 这两个版本

想要支持 将字符数组 / 整型数组直接作为vector 的构造函数的实参

必须在initializer_list<T> 已经设计完毕的基础上

initializer_list<T>是一个类,

其成员变量中有两个迭代器,是数组的首尾指针

其成员函数中有size,反映数组中的元素个数

注意:

  1. vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8 };这句话合法

合法的原因:

在创建临时变量实例时,vector<int> tmp({ 1, 2, 3, 4, 5, 6, 7, 8 });合法

  1. vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8 };

看起来就像发生了隐式类型转换

类中的成员函数可以是一个模板函数

那么构造函数可以用一下的形式进行编写,通过两个迭代器实现

注意:下面的memcpy不能保证深拷贝

因为如果 此时vector中存放的都是string类型的变量

那么memcpy只会把_start中每个string的实例中的成员变量

依次赋值给tmp,由于string的成员变量是:_arr; _size; _capacity

所以此时只会让tmp中的每个string实例中的成员和_start中的地址相同

那么对tmp 和_start进行析构时,将会对同一块空间析构两次

所以应该使用自定义类型本身的赋值重载,实现地址的深拷贝

如果用模板 + 迭代器的形式实现构造函数,

那么迭代器可以将字符型指针作为迭代器,传入到一个以int类型为内容的vector容器中

实际上C++库中把 { 1, 2, 3, 4, 5, 6, 7, 8 }这种变量

直接封装成了一个类,该类的类型为initializer_list<int>

即下面的代码中x 是initializer_list<int> 类型的变量

std::vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8 };这句话能执行,

本质上是因为库中写了一个vector(initializer_list<T> arr);的构造函数

下面说明std::vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8 };这句话的执行过程

先利用{ 1, 2, 3, 4, 5, 6, 7, 8 }这个initializer_list<int> 类型的变量

执行vector<int> tmp({ 1, 2, 3, 4, 5, 6, 7, 8 });

调用vector中单参数的构造函数

产生一个vector<int>类型的临时变量

再将调用 vector中的拷贝构造,拷贝构造传入的形参就是这个临时变量

这也说明了在设计 拷贝构造 和 push_back 这样的成员函数时

需要对形参的类型加一个const限定

删除偶数

下面的程序加else是必须的,这是因为迭代器不同域数组下标

执行erase方法之后会立马将后面的所有元素往前移动

那么此时如果要实现删除偶数只能通过++it;

对于VS平台下,其C++库中要求:只要使用了erase方法

要想继续使用iterator,只能通过erase方法的返回值更新迭代器,

此时VS下的erase方法将会返回当前删除的元素对应的迭代器

注意:此时的迭代器不是指针,不是指针这一点是和linux平台下是不同的

相关推荐
〆、风神10 分钟前
EasyExcel 数据字典转换器实战:注解驱动设计
android·java·注解
Thanwind11 分钟前
关于JVM和OS中的指令重排以及JIT优化
java·jvm·jmm
点燃大海15 分钟前
MySQL表结构导出(Excel)
java·数据库·python·mysql·spring
十五年专注C++开发34 分钟前
QT 中的元对象系统(五):QMetaObject::invokeMethod的使用和实现原理
开发语言·数据结构·c++·qt·设计模式
熬夜学编程的小王39 分钟前
【C++初阶篇】C++中c_str函数的全面解析
c语言·c++·c_str
我是小路路呀1 小时前
vue开始时间小于结束时间,时间格式:年月日时分
前端·javascript·vue.js
一线灵1 小时前
跨平台游戏引擎 axmol-2.5.0 发布
c++·游戏引擎·wasm·axmol
虾球xz1 小时前
游戏引擎学习第201天
前端·学习·游戏引擎
渴望脱下狼皮的羊1 小时前
C++基础讲解
开发语言·c++·后端
我自纵横20231 小时前
JavaScript 中常见的鼠标事件及应用
前端·javascript·css·html·计算机外设·ecmascript