vector容器+模拟实现

本文详细介绍了C++中vector容器的迭代器、常用接口、动态增长原理以及迭代器失效的原因。并探讨了vector的模拟实现,包括构造函数、析构函数、迭代器和operator[]的实现。同时,文章强调了在使用迭代器时避免失效问题的重要性,并给出了vector的增删改查操作。最后,讨论了vector的容量问题、拷贝构造函数和memcpy拷贝问题,提醒在处理自定义类型时要谨慎使用memcpy。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器

四种迭代器

容器类名::iterator  迭代器名;//正向迭代器
容器类名::const_iterator  迭代器名;//常量正向迭代器,const修饰,只能用于读取容器内的元素,不能改变其值
容器类名::reverse_iterator  迭代器名;//反向迭代器
容器类名::const_reverse_iterator  迭代器名;//常量反向迭代器,const修饰,只能用于读取容器内的元素,不能改变其值

begin + end: 获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置
的iterator/const_iterator
rbegin + rend: 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator

C++为每种容器类型定义了一种名为const_iterator的类型,该类型只能用于读取容器内的元素,但不能改变其值。
对const_iterator类型解引用,得到的是一个指向const对象的引用。

for (vector<string>::const_iterator iter = text.begin(); iter != text.end(); ++ iter){
         cout << *iter << endl; //ok: print each element in text
         *iter = " ";     // error: *iter is const
     }

const_iterator可以用于const或者非const容器(因为不能修改对象的值),但是const的iterator只能用于非const容器(只能修改唯一指向的值)。

const vector<int> nines(10, 9);  // cannot change elements in nines
     // error: cit2 could change the element it refers to and nines is const
     const vector<int>::iterator cit2 = nines.begin();
     // ok: it can't change an element value, so it can be used with a const vector<int>
     vector<int>::const_iterator it = nines.begin();
     *it = 10; // error: *it is const
     ++it;     // ok: it isn't const so we can change its value

通过迭代器可以读取它指向的元素,迭代器名就表示迭代器指向的元素。通过非常量迭代器还能修改其指向的元素。

迭代器都可以进行++操作。反向迭代器和正向迭代器的区别在于:

  • 对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素;
  • 而对反向迭代器进行++操作时,迭代器会指向容器中的前一个元素。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> v;  //v是存放int类型变量的可变长数组,开始时没有元素
    for (int n = 0; n<5; ++n)
        v.push_back(n);  //push_back成员函数在vector容器尾部添加一个元素
    vector<int>::iterator i;  //定义正向迭代器
    for (i = v.begin(); i != v.end(); ++i) {  //用迭代器遍历容器
        cout << *i << " ";  //*i 就是迭代器i指向的元素
        *i *= 2;  //每个元素变为原来的2倍
    }
    cout << endl;
    //用反向迭代器遍历容器
    for (vector<int>::reverse_iterator j = v.rbegin(); j != v.rend(); ++j)
        cout << *j << " ";
    return 0;
}

begin 成员函数返回指向容器中第一个元素的迭代器iterator

end 成员函数返回的不是指向最后一个元素的迭代器,而是指向最后一个元素后面的位置的迭代器

rbegin 成员函数返回指向容器中最后一个元素的迭代器reverse_iterator

rend 成员函数返回指向容器中第一个元素前面的位置的迭代器

vector介绍

vector的本质其实是一个顺序表的结构,也可以说是数组存储,与顺序表的结构很相似,vector的接口更为完善。

vector容器是一个单口的容器,从头部或者中间插入元素需要向后移动大量元素,是不是和栈很相似啊。

概述

vector容器

  • 数据结构:连续存储空间
  • 迭代器:随机迭代器,提供读写操作,并能在数据中随机移
  • vector容器动态增长原理:
    • 当存储空间不够的时候,会另外开辟一块更大的空间,把数据拷贝过去,然后销毁原来的空间
    • 申请的空间,会比用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值