Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用反向迭代器擦除最后一个元素_C++_Std_Reverse Iterator - Fatal编程技术网

C++ 使用反向迭代器擦除最后一个元素

C++ 使用反向迭代器擦除最后一个元素,c++,std,reverse-iterator,C++,Std,Reverse Iterator,最近,我在维护的代码中发现了以下内容: for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--) { another_container->push_back(*rit); base_container::erase((++rit).base()); } for(反向迭代器rit=base\u container::r

最近,我在维护的代码中发现了以下内容:

for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--) 
{
  another_container->push_back(*rit);
  base_container::erase((++rit).base());
}
for(反向迭代器rit=base\u container::rbegin();rit!=base\u container::rend()&&0推回(*rit);
base_容器::擦除(++rit.base());
}
它尝试使用反向迭代器从循环中的容器(本例中为std::list)中删除最后一个元素。关键是它看起来应该能正常工作,但却不能正常工作(一些内存损坏是由于无效的迭代器造成的),我想知道为什么?是否有任何限制或规定不这样做

谢谢


另外,为了防止对解决方案进行任何改进,我已经重新编写了解决方案,使其能够工作。问题是为什么上面的代码不能正常工作?

调用
erase
后的所有迭代器都无效。但是,
erase
返回您可以使用的迭代器。

调用
erase
后的所有迭代器都无效。但是,
erase
返回您可以使用的迭代器。

调用
erase
后的所有迭代器都无效。但是,
erase
返回您可以使用的迭代器。

调用
erase
后的所有迭代器都无效。然而,
erase
返回您可以使用的迭代器。

rit
erase
调用无效。

rit
erase
调用无效。

rit
erase
调用无效。

rit
erase
调用无效。

需要保存
erase()
的返回值,并将其转换回
reverse\u iterator
,以避免迭代器失效

for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--) 
{
  another_container->push_back(*rit);
  auto it =base_container::erase((++rit).base()); //erase will return an iteraotor
  rit(it);//converting iterator to reverse_iterator.
}
for(反向迭代器rit=base\u container::rbegin();rit!=base\u container::rend()&&0推回(*rit);
auto it=base_container::erase(++rit).base();//erase将返回一个iteraotor
rit(it);//将迭代器转换为反向迭代器。
}

您需要保存
erase()
的返回值,并将其转换回
反向迭代器
,以避免迭代器失效

for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--) 
{
  another_container->push_back(*rit);
  auto it =base_container::erase((++rit).base()); //erase will return an iteraotor
  rit(it);//converting iterator to reverse_iterator.
}
for(反向迭代器rit=base\u container::rbegin();rit!=base\u container::rend()&&0推回(*rit);
auto it=base_container::erase(++rit).base();//erase将返回一个iteraotor
rit(it);//将迭代器转换为反向迭代器。
}

您需要保存
erase()
的返回值,并将其转换回
反向迭代器
,以避免迭代器失效

for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--) 
{
  another_container->push_back(*rit);
  auto it =base_container::erase((++rit).base()); //erase will return an iteraotor
  rit(it);//converting iterator to reverse_iterator.
}
for(反向迭代器rit=base\u container::rbegin();rit!=base\u container::rend()&&0推回(*rit);
auto it=base_container::erase(++rit).base();//erase将返回一个iteraotor
rit(it);//将迭代器转换为反向迭代器。
}

您需要保存
erase()
的返回值,并将其转换回
反向迭代器
,以避免迭代器失效

for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--) 
{
  another_container->push_back(*rit);
  auto it =base_container::erase((++rit).base()); //erase will return an iteraotor
  rit(it);//converting iterator to reverse_iterator.
}
for(反向迭代器rit=base\u container::rbegin();rit!=base\u container::rend()&&0推回(*rit);
auto it=base_container::erase(++rit).base();//erase将返回一个iteraotor
rit(it);//将迭代器转换为反向迭代器。
}


不是你问题的答案,但为什么这么复杂?你不能先把整个容器倒过来复制一下,然后再把原来的那一个清除掉吗?还有,什么是基本容器?std::list正如我在上面写的那样,您从容器继承了吗-(基本容器只是std:list@Rom098:很抱歉,我的错误没有回答您的问题,但为什么这么复杂?您不能先反向复制整个容器,然后清除原始容器吗?还有,什么是基本容器?std::列表正如我上面写的,您是否继承容器作为
base\u容器::
建议?:-(基本容器只是std:list@Rom098:很抱歉,我的错误没有回答您的问题,但为什么这么复杂?您不能先反向复制整个容器,然后清除原始容器吗?还有,什么是基本容器?std::列表正如我上面写的,您是否继承容器作为
base\u容器::
建议?:-(基本容器只是std:list@Rom098:很抱歉,我的错误没有回答您的问题,但为什么这么复杂?您不能先反向复制整个容器,然后清除原始容器吗?还有,什么是基本容器?std::列表正如我上面写的,您是否继承容器作为
base\u容器::
建议?:-(基本容器只是std:list@Rom098:抱歉,我的错误不是所有的迭代器。但肯定是指向已擦除元素的迭代器。不是所有的迭代器。但肯定是指向已擦除元素的迭代器。不是所有的迭代器。但肯定是指向已擦除元素的迭代器。不是所有的迭代器。但肯定是迭代器或者指向已擦除的元素。