vector之erase()

2023-11-05 01:32
文章标签 vector erase

本文主要是介绍vector之erase(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

vector之erase()

vector的erase()是需要我们特别注意的。当调用erase()后,删除元素的指针变成了野
指针,这时很容易发生错误,比如越界或者获取的值不是我们要的值。
  • 解决办法,调整访问迭代器

    • 从下列代码及其输出我们发现,A处发生了访问错误,所访问的值并不是我们所期望的
      值。在对i调整后即 a.begin()+i调整了访问迭代器,使我们能够访问到我们所期望的值。
    • 调用erase(a.begin()+i)后,删除了第i个元素,i后的元素前移动一位,不过不调整i,正如A
      处的代码,我们将访问的是原来i+2的元素,而i+1的元素因为erase()移动到了原来i的位
      置,这样就造成,访问丢失,解决办法,见代码B。

    • 图例
      erase()

    • 结论:使用erase()后的循环访问要谨慎,应正确理解erase()的工作原理。
  • code:

#include<iostream>
#include<vector>
using namespace std;
vector<int>a;
int main()
{for(int i=0;i<10;i++){a.push_back(i);}int j=0;//调用erase()后a.size()发生了变化for(int i=0;i<a.size();i++)//+++++++++++++++A{cout<<a.at(i)<<endl;if(i>3){//删除的是原来 i i+1 i+2出的元素a.erase(a.begin()+i);}}cout<<"-------------------------"<<endl;a.clear();for(int i=0;i<10;i++){a.push_back(i);}for(int i=0;i<a.size();i++)//++++++++++++++++++B{cout<<a.at(i)<<endl;if(i>3){a.erase(a.begin()+i);//通过调整i,访问到了原来所有的元素,尽管a.size()在一直变化。//删除的总是同一位置上的元素i--;}}return 0;
}/*
output:0123468-------------------------0123456789*/
  • 参考
    • vector::erase
      Iterator validity
      Iterators, pointers and references pointing to position (or first) and beyond are invalidated, with all iterators, pointers and references to elements before position (or first) are guaranteed to keep referring to the same elements they were referring to before the call.

这篇关于vector之erase()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/346504

相关文章

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

C++提高编程三(vector容器、deque容器)

文章目录 vector容器vector赋值操作vector容量和大小vector插入和删除vector数据存取vector互换容器vector预留空间deque容器构造函数deque赋值操作deque大小操作deque 插入和删除deque 数据存取deque 排序 vector容器 vector容器数据结构和数组相似,也称为单端数组。区别在于数组是静态空间,vector可以

STL-vector

string中拷贝构造的现代写法 string(const string& s):_str(nullptr){string tmp(s);swap(_str,tmp._str);} //s1=s3string& operator=(string s){swap(_str,s._str);return *this;} s(由s3调拷贝构造而来)是一个临时对象出了作用域要调析构函数。

容器第二课,List,ArrayList,LinkedList,Vector用法详解

package com.pkushutong.Collection;import java.util.ArrayList;import java.util.Date;import java.util.List;public class Test01 {public static void main(String[] args) {List list = new ArrayList<>();/*

Error: label vector and instance matrix must be double的解决方法

在使用uci下载的数据时,建模时出现这个错误的解决方法 首先现在UCI上面下载数据 然后右键另存为就行了。这样我们就从UCI里面下载到了训练数据 在matlab 点 导入数据,数据类型要记得选第二个, 如果选择最后一个table就会出现这个问题 最后附上代码 %%之前先import wine.date IMPORTED DATA 设为Numeric Matrix (数值矩

【C++】C++ STL探索:Vector使用与背后底层逻辑

C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现 在string类文章中提及了STL容器间的接口是大差不差的,本篇将直接通过模拟实现Vector来讲解底层实现与使用。 🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔

【C++】vector的简单模拟实现

目录 一、vector的基本实现机制: 二、vector的部分接口模拟实现: 1、构造与析构: 1、普通构造: 2、拷贝构造: 3、析构函数: 2、关于扩容: 1、reserve: 2、resize 3、增删查改: 1、在pos位置插入: 2、[]符号访问修改: 3、删除pos位置的值: 4、重载=运算符: 一、vector的基本实现机制: 如上所

STL—Vector详解

1.vector的介绍和使用  vector实际上是一个类模板,allocator (对象分配的元素的类型) 是第二个模板参数。 2.vector的使用 (1) vector的定义 int TestVector1(){// constructors used in the same order as described above:vector<int> first;

新手小白都能一步到位的vector

目录 前言 1.vector的介绍 2.vector的部分使用 2.1(constructor)构造函数声明 2.2vector的遍历(与string是相似的)  2.3 vector容量空间  2.4vector的增删查改 3.vector的嵌套 结束语 前言 前面我们学习C++的string部分,其中的接口,函数都很多,vector相较与string的学习就会

【C++】【日志贴】浅谈标准库类型string、vector及C风格字符串在全局和局部作用域中默认初始值情况

平时练习发现这个问题,记录一下。 C风格字符串在全局和局部作用域中初始值情况【空字符+未定义的字符】由于内存没有初始化造成的对于栈,内存如果没有初始化,则会出现“烫烫烫烫烫烫”;对于堆,内存如果没有初始化,则会出现“屯屯屯屯屯”;有时候数组没有结束符,输出数组也会有这些汉字的出现,就是因为没有结束符占用了后面的空闲的内存块即没有初始化的内存块 标准库类型string