C++stl问题reverse_iterator

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++stl问题reverse_iterator相关的知识,希望对你有一定的参考价值。

#include<vector>
#include<iostream>
using namespace std;
template <class T>
bool fun(const vector<T>& v)

vector<T>::const_iterator i=v.begin();
vector<T>::reverse_iterator r=(const vector<T>&)v.rbegin();
for(;i!=v.end()&&r!=(const vector<T>&)v.rend();)

if(*i!=*j)return false;r++;i++;

return true;

void main()

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(1);
if(fun(v))cout<<"true!"<<endl;

错误::
\exe1\main.cpp(22) : see reference to function template instantiation 'bool __cdecl fun(const class std::vector<int,class std::allocator<int> > &)' being compiled
exe1\main.cpp(9) : error C2784: 'bool __cdecl std::operator !=(const class std::allocator<_Ty> &,const class std::allocator<_U> &)' : could not deduce template argument for 'const class std::allocator<_Ty> &' from 'class std::r
everse_iterator<int *,int,int &,int *,int>'
exe1\main.cpp(22) : see reference to function template instantiation 'bool __cdecl fun(const class std::vector<int,class std::allocator<int> > &)' being compiled
exe1\main.cpp(9) : error C2784: 'bool __cdecl std::operator !=(const class std::allocator<_Ty> &,const class std::allocator<_U> &)' : could not deduce template argument for 'const class std::allocator<_Ty> &' from 'class std::r
everse_iterator<int *,int,int &,int *,int>'
exe1\main.cpp(22) : see reference to function template instantiation 'bool __cdecl fun(const class std::vector<int,class std::allocator<int> > &)' being compiled
\exe1\main.cpp(9) : error C2784: 'bool __cdecl std::operator !=(const struct std::pair<_T1,_T2> &,const struct std::pair<_T1,_T2> &)' : could not deduce template argument for 'const struct std::pair<_T1,_T2> &' from 'class std::
reverse_iterator<int *,int,int &,int *,int>'
我初学STL
这个应该就是reverse_iterator的常参数问题了 怎么解决啊 谢谢了

reverse_iterator也有const版本的const_reverse_iterator,直接使用即可,不用与const_iterator进行类型转换。
可编译的程序如下:
#include<vector>
#include<iostream>
using namespace std;

template <class T>
bool fun(const vector<T>& v)

vector<T>::const_iterator i=v.begin();
vector<T>::const_reverse_iterator r=v.rbegin();
for(;i!=v.end()&&r!=v.rend();)

if(*i!=*r)return false;r++;i++;

return true;

void main()

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(1);
if(fun(v))cout<<"true!"<<endl;
参考技术A vector <Pro> mydata;
应该可以。
你是不是用了排序却没有定义 < 运算?

使用 reverse_iterator 擦除最后一个元素

【中文标题】使用 reverse_iterator 擦除最后一个元素【英文标题】:Erasing the last element with the reverse_iterator 【发布时间】:2015-07-20 13:01:41 【问题描述】:

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

for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--) 

  another_container->push_back(*rit);
  base_container::erase((++rit).base());

它尝试使用 reverse_iterator 在循环中从容器(在本例中为 std::list)中删除最后一个元素。关键是它看起来应该可以正常工作,但事实并非如此(由于无效的迭代器导致一些内存损坏),我想知道为什么?是否有任何限制或规则不这样做?

谢谢。

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

【问题讨论】:

不是你的问题的答案,但为什么这么复杂?你不能先反向复制整个容器然后清除原始容器吗?另外,什么是base_container? std::list 正如我上面写的 您是否按照base_container:: 的建议从容器继承? :-( base_container 只是 std:list 的 typedef @Rom098:对不起我的错误 【参考方案1】:

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

【讨论】:

不是所有的迭代器。但肯定是指向被擦除元素的迭代器。【参考方案2】:

riterase 调用无效

【讨论】:

【参考方案3】:

您需要保存erase()的返回值并将其转换回reverse_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.

【讨论】:

以上是关于C++stl问题reverse_iterator的主要内容,如果未能解决你的问题,请参考以下文章

如何维护 C++/STL 中的函数列表?

实现一个符合 C++17 的 STL 容器? [关闭]

c ++:在c ++ STL中使用map编译错误? [关闭]

良好的 C 类 STL 库 [关闭]

C++98/C++03 STL 设置错误?

C++ STL 问题:分配器