C++ 嵌套vector中使用erase,没有真正删除元素

数据放在一个嵌套的vector里,我需要找到内层vector的特定元素然后删掉。但是我发现没有真的删掉,还是能访问到。为什么呢

 bool LayerDic::remove(CString IdCStr)
{
      vector<vector<Data>>::iterator  group2 = resDataGroup.begin();
      while ((group2) != resDataGroup.end()) {
           vector<Data>::iterator  it = (*group2).begin();
           while ((it) != (*group2).end()) {
           if (it->getIdCStr().Compare(IdCStr) == 0)
           {
                    (*group2).erase(it);  
                    temp();//为了验证是否真的删除
                    return true;
              }
        }
    }
    return false;
}

void LayerDic::temp()
{
      vector<vector<Data>>::iterator  group2 = resDataGroup.begin();
    while ((group2) != resDataGroup.end()) 
        {
          vector<Data>::iterator  it = (*group2).begin();
          while ((it) != (*group2).end()) {
            CString cs = it->getIdCStr();
            it++;
        }
        group2++;
    } 
}
c++
0

2个回答

你的remove函数里迭代器指针没有移动吧,group2和it都没有向后移动

0
qq_33298609
好来滴茶 我是不是应该考虑不用两层vector,把里面的那层封装成一个类呢
10 个月之前 回复
qq_33298609
好来滴茶 我看了那个例子,但是他是清空整个int*(对应我的内层vector对吧),delete掉一个指针,但是我要删的不是一个指针,而是对象对吧,所以就用不了delete
10 个月之前 回复
qq_37245458
shakker2c https://blog.csdn.net/how0723/article/details/78451930考这位博主的文章
10 个月之前 回复
qq_33298609
好来滴茶 啊对的,谢谢提醒哈,恰巧数据是第一个就返回了,才没死循环。但是对我说的erase没真的把元素删掉的问题没有影响啊,到底是怎么了
10 个月之前 回复

你的“还可以访问到”是指的什么呢?
因为你的remove只删除了一个就返回了,会不会是因为你的这个向量中有多个这种特定元素导致删除完一个其余的还存在?

0
qq_33298609
好来滴茶 “还可以访问到”是指删完之后我马上在temp函数里面又遍历了一遍,发现是可以访问到的。因为我的链表一开始就只有一个值。所以证明那个元素没被删掉
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
vector容器删除某些元素且释放内存
1,size和capacity size: 指目前容器中实际有多少元素,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小。 capacity: 指最少要多少元素才会使其容量重新分配,对应reserve(size_type new_size)会这置这个capacity值,使它不小于所指定的new_size。 所以用reserve(si
c++容器vector删除元素erase()与迭代器的使用
写代码时用 for 循环删除 vector 中的元素发现总是报错,后来最细看了下 erase() 方法发现 erase()方法使用后原来的迭代器失效,返回新的迭代器。正确的使用方法是:#include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; using namespace std; int main() { vector&amp;lt;int&amp;gt; v = ...
C++ 嵌套vector中使用erase,没有真正删除元素
数据放在一个嵌套的vector里,我需要找到内层vector的特定元素然后删掉。但是我发现没有真的删掉,还是能访问到。为什么呢rnrn```rn bool LayerDic::remove(CString IdCStr)rnrn vector>::iterator group2 = resDataGroup.begin();rn while ((group2) != resDataGroup.end()) rn vector::iterator it = (*group2).begin();rn while ((it) != (*group2).end()) rn if (it->getIdCStr().Compare(IdCStr) == 0)rn rn (*group2).erase(it); rn temp();//为了验证是否真的删除rn return true;rn rn rn rn return false;rnrnrnvoid LayerDic::temp()rnrn vector>::iterator group2 = resDataGroup.begin();rn while ((group2) != resDataGroup.end()) rn rn vector::iterator it = (*group2).begin();rn while ((it) != (*group2).end()) rn CString cs = it->getIdCStr();rn it++;rn rn group2++;rn rnrn```
c++中删除迭代器指向的元素后,迭代器指向的被删除元素后面的元素
1.  C++向容器中插入和删除元素的时候,迭代器会失效,下面是正确删除容器元素的做法 void StatsServer::removeExpiredWorkers() { size_t expiredWorkerCount = 0; size_t expiredUserCount = 0; pthread_rwlock_wrlock(&amp;amp;rwlock_); // wri...
Qt/C++工作笔记-对vector与QVector中erase操作的进一步认识(区别与联系)
VS代码如下:#include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; using namespace std; void main(){ vector&amp;lt;int&amp;gt; intVec; for (int i = 0; i &amp;lt; 10;i++){ intVec.push_back(i); } vector&amp;lt;int&amp;gt;:...
谈谈C++中vector的删除
在vector中有三种涉及删除的方法,第一种是vector::clear(),第二种是vector::erase(),第三种是vector::pop_back()。clear用来清空整个vector,同时将size变成0,无返回值;erase通过传入迭代器进行删除,既可以删除单个元素,也可以删除某一范围的元素,删除之后它将返回下一个位置的迭代器;pop_back用来删除末尾元素,同时将size减1...
vector::erase方法,返回值是更新后的容器的被删除元素的后一个元素的迭代器,如果需要指向删除元素的前面一个元素的迭代器就要-1
vector::erase方法,返回值是更新后的容器的被删除元素的后一个元素的迭代器,如果需要指向删除元素的前面一个元素的迭代器就要-1
vector中删除元素erase的用法
erase的用法删除vector中特定的元素。非常简单实用。
vector的erase失效问题
VS和CGwin的实现效果还不一样,这里先记录下问题及解决方法。欢迎和大家一起探讨。 vector容器erase操作后iterate失效真相 一、VS环境下erase代码分析 代码: for (auto iter = vec.begin(); iter != vec.end(); ++iter) { if (3 == *iter) { ...
std::vector删除元素迭代器以及内存的变化
 std::vector是顺序容器,当用erase成员函数删除一个迭代器指向的元素时,会自动移动(不是std::move)后面的元素到前面来,而迭代器的指向不变(如果是std::map、std::list这类关联型容器,迭代器会失效),并且不会回收内存(也就是capacity不会变)。当用swap成员函数跟自身的拷贝交换时,才能释放多余内存。 代码如下,自定义一个foo类以监视构造、赋值、复制、...
vector的remove和erase函数的区别
首先我们先来看一下两个函数 iterator erase(iterator position); iterator erase(iterator first, iterator last); erase: erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器,而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元...
vector中使用erase操作删除迭代器的问题(避免野指针)以及end的地址变化
在vector中,使用erase来剔除对应的元素,但是使用iterator的时候需要注意不要让iterator变成野指针 vector的erase 在C++ Reference 中,对erase的说明如下: vector::erase - C++ Reference http://www.cplusplus.com/reference/vector/vector/erase/ //c++98 i...
c++,vector的erase循环删除
c++ 中Vector中,循环使用erase来删除某一个位置,将指向下一个位置,所以将其返回值依旧指向迭代器iter。(指针指向问题)     vector&amp;lt;int&amp;gt;::iterator iter;     vector&amp;lt;int&amp;gt;::iterator iter1;     for (iter = nums.begin();iter != nums.end() - 1;) ...
Vector erase 用法:删除指定元素
#include #include using namespace std; int main() {     vector v;     vector ::iterator it;     for(int i=0;i         v.push_back(i);     }     cout     for(it=v.begin();it!=v.end();it+
c++ STL容器在循环中删除迭代器的处理细节
c++中STL容器vector/list/map/set/deque/string等删除元素的问题,迭代器容易出现以下错误,示例代码如下:std::vector&amp;lt;int&amp;gt; arrayList; ... std::vector&amp;lt;int&amp;gt;::iterator it = arrayList.begin(); for ( ; it != arrayList.end(); it++)...
STL中map/vector的删除元素操作
在我们使用C++中的STL的时候,可以使用迭代器iterator进行遍历,但是当我们通过iterator对vector和map删除元素的时候,要格外的小心,往往操作不当,导致iterator失效,后果就是程序奔溃。      1. 对于vector,erase会返回下一个iterator。所以一般采用的方法是:      因为在使用erase的时候,删除元素前面的iterator有效,但是后
没有躲过的坑--vector使用erase后迭代器变成野指针
vector上镜率非常高,但是最近又被他fuck了一下。使用的就是vector的erase方法。erase–return value 首先需要明确一下vector的两种erase:C++98中是这样的:iterator erase (iterator position); iterator erase (iterator first, iterator last)C++11是这样的:iterat
关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论
关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论1.前言:最近在做某一个题时,用到了vector的删除操作,利用的是erase()函数删除符合条件的函数,然后和同学讨论的时候,同学给了一个写法,网上也搜到了一个写法,但是发现了问题。2.测试代码:定义一个vector 删除指定元素, 这里是删除1#include <vector> #includ
STL vector的erase方法使用
在stl中vector容器使用中,有时要在for循环中删除多个元素。 如下使用示例:#include <iostream> #include <vector>using namespace std;int main() { vector<int> vi = {1, 2, 2, 4, 4, 4, 10, 3, 4, 4, 4}; cout << "Erase before >>>" <
vector中erase()的使用
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(   iterator _Where); iterator erase(   iterator _First,   iterator _Last); 如果是删除指定位置的元素时: 返回值是一个迭代器,指向删除元素下一个元
vector::erase()函数调用出错问题
vector::erase()函数调用出错问题 vector::erase()方法有两种重载形式 iterator erase(   iterator _Where);//删除某个元素 iterator erase(   iterator _First,   iterator _Last);//删除一段元素,注意是个半开区间 返回值: 如果是删除指定位置的元素时,返回
vector.erase()用法介绍及注意事项;
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(   iterator _Where); 删除指定位置的元素,返回值是一个迭代器,指向删除元素的下一个元素; iterator erase(   iterator _First,   ite
vector和map用erase删除元素
1、vector的删除 vector的删除中,可以有erase和pop_back函数。erase可以删除指定元素或指定位置的元素,而pop_back只能去掉数组的最后一个元素。这里我们讨论erase函数的用法。 假设有如下程序: vector&lt;int&gt; vec; vec.push_back(1); vec.push_back(2); vec.push...
vector使用erase后,迭代器变得不稳定
发现问题背景 在执行以下代码时,会产生错误: for (it = pipe.begin(); it!=pipe.end(); it++) { if (*it == 1) { pipe.erase(it); //调用完erase之后,迭代器it变为野指针(很不稳定) it--; //这一步开始出错 } } 解决方法 for (it = pipe.begin();...
vector删除相同的元素
这是我在百度知道里面遇到的一个问题,准备实现这个功能的时候,以为这个问题很简单,做的时候才发现有很多问题。 很多人想到的就是用: sort(v.begin(), v.end()); unique(v.begin(), v.end());  但我想试过的人都知道这方法不行【原因我还在找】   我的方法是用set,因为set自动会删除相同的元素,在百度里面有会朋友用的双循环(这方...
STL 使用 erase 删除元素时 iterator 失效
STL中的容器按存储方式分为两类:一类是序列容器(如:vector,deque),另一类是关联容器(如:list,map,set)。 在使用erase方法删除元素时,有几点需要注意: 1) 对于关联容器(如map, set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为
删除vector指定下标的元素
//删除vector中指定下标的元素,加&可以改变vector的值,不加就不会改变 void ControlCards::deleteCard(vector &cards,int index) {     vector::iterator  it = cards.begin()+index ;     cards.erase(it); }
一次循环删除std::vector元素的方法
最近又遇到这个逻辑,耽误了不少时间,现在整理下: erase返回的是指向删除元素的下一个元素的迭代器,那么根据这个逻辑,所以一次循环删除逻辑如下; for (auto it = vecReply.begin(); it != vecReply.end();) { if (it->xx== xx) { it = vecReply.erase(it); } else
vector.erase() 的使用方法及注意事项
1 使用方法 vector.erase()的功能从指定容器中删除指定位置的元素或某段范围内的元素,有以下两种重载方式: iterator erase( iterator _Where);//删除指定位置的元素,返回值是一个迭代器,指向删除元素的下一个元素; iterator erase( iterator _First, iterator _Last);//删除从_First开始...
vector、list、map、set中的erase用法
(1)list与vector     list与vector中的erase用法相同,它们的 erase 函数会返回指向下一个元素的迭代器,因此在遍历时,只需要 it = c.erase(it); 即可。如示例代码: vector&amp;lt;int&amp;gt;::iterator it = vec.begin();   for (; it != vec.end();)   {       if (*i...
vector 中删除指定元素
#include #includestring> #include using namespace std; int main() { vectorint> iVec; vectorint>::iterator it; int i; for( i=0;i10;i++) iVec.push_back(i); for( i=0;i)
C++ STL容器中循环删除时erase的使用
主要是看不同容器在C++98和C++11的不同表现 序列化容器 C++98和C++11的vector的erase()接口没啥使用区别 从简单的测试例子讲解 vector&amp;lt;int&amp;gt; vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); for (vector&amp;lt;int&amp;gt;::iter...
vector的erase()函数分析
erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器,而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素的迭代器: 在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素。 删除一段元素后,
vector erase()用法
iterator erase (const_iterator position); iterator erase (const_iterator first, const_iterator last); 从vector中删除一个元素(position),或者范围元素( [first, last) ) 参数: position :iterator 指向vector 中要删除元素的位置。  ...
遍历vector时插入与删除
//在遍历vector时,中间插入与删除需注意,有坑 //本示例在每个数字“3”后面插入“4” vector&amp;lt;int&amp;gt; vec1 = {1,3,2,3,5,3}; vector&amp;lt;int&amp;gt;::iterator it1 = vec1.begin(); int i = 0; int idx = 0; while (it1 != vec1.end()) { if (...
删除vector中的重复数据(unique)
#include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;algorithm&amp;gt; #include &amp;lt;assert.h&amp;gt; using namespace std; template&amp;lt;typename T&amp;gt; inline void deduplication(T&amp;amp; c) { sort(c...
[C++]vector删除多个元素的方法
这个问题,之前使用编译器DEVC++的时候,还没有发现,换用了visual studio之后,就开始疯狂报错,vector iterator not decrementable 于是想起来还有数据结构里面学到的list(在stl中是双向链表) 所以就解决了这个问题,只需要将声明由vector &amp;lt;type&amp;gt;换为list &amp;lt;type&amp;gt;就解决了 示例代码: #inclu...
string中常用函数总结一(erase和insert)
erase(删除字符(串)) (1)basic_string&amp;amp; erase ( size_type __pos = 0, size_type __n = npos); //删除从pos处开始的n个字符,pos默认为0,n默认为npos,函数返回值类型为string的引用,值为修改后的字符串 (2)iterator erase ( iterator __position ); //删除...
C++之vector容器初学(二)——插入和删除
插入操作: 理论知识 ² vector.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。 ² vector.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。 ² vector.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值  简单案例
remove_if详解,配合erase
remove_if详解,配合erase