c++ - 反向迭代器算法

标签 c++ stl

所有,我正在尝试对列表中的元素进行反向比较,所以我使用反向迭代器。

代码如下

#include <list>

struct Element {
 double a;
 double b;
};
typedef std::list<Element> ElementList;

class DoStuff {
public:
  DoStuff();

  void removeDuplicates(ElementList & incList) const {
     for(ElementList::reverse_iterator stackIter = incList.rbegin(); stackIter != incList.rend(); ++stackIter) {
        bool uniqueElement = true;
        for(ElementList::reverse_iterator searchIter = stackIter+1; searchIter != incList.rend() && uniqueElement; ++searchIter) {
            //Check stuff and make uniqueElement = true;
         } 
     }
  }
};

int main() {
  std::list<Element> fullList;

  DoStuff foo;
  foo.removeDuplicates(fullList);
}

我在创建 searchIter 时遇到编译错误...为什么...

这行得通,但读起来很蠢:

ElementList::reverse_iterator searchIter = stackIter;
searchIter++;
for( ; searchIter != incList.rend() && uniqueElement; ++searchIter) {

}

错误如下:

In file included from /usr/local/include/c++/6.1.0/bits/stl_algobase.h:67:0,
                 from /usr/local/include/c++/6.1.0/list:60,
                 from main.cpp:1:
/usr/local/include/c++/6.1.0/bits/stl_iterator.h: In instantiation of 'std::reverse_iterator<_Iterator> std::reverse_iterator<_Iterator>::operator+(std::reverse_iterator<_Iterator>::difference_type) const [with _Iterator = std::_List_iterator<Element>; std::reverse_iterator<_Iterator>::difference_type = long int]':
main.cpp:16:66:   required from here
/usr/local/include/c++/6.1.0/bits/stl_iterator.h:233:41: error: no match for 'operator-' (operand types are 'const std::_List_iterator<Element>' and 'std::reverse_iterator<std::_List_iterator<Element> >::difference_type {aka long int}')
       { return reverse_iterator(current - __n); }

最佳答案

某些迭代器 it 和整数 n 的语法 it + n 要求迭代器是“随机访问迭代器”。列表迭代器不满足该要求。

要解决“读起来很笨” 问题,您可以使用std::next :

for(ElementList::reverse_iterator searchIter = std::next(stackIter); ...

或者,减少输入:

for(auto searchIter = std::next(stackIter); ...

关于c++ - 反向迭代器算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38129618/

相关文章:

c++ - 静态数组的行为改变了吗?

c++ - G++ 编译器无法识别 C++ 中的枚举类型

c++ - 可变参数

c++ - 当我们迭代它时更改 HashMap 的行为是否已定义?

c++ - 从文件中读取数据并填充STL vector

c++ - 推力结构 vector 的迭代器

c++ - 在 Linux/Windows 上使用 c++ 的 GUI 应用程序

c++ - 添加初始化列表的元素

c++从另外两个集合形成集合

c++ - 通过迭代指针键控映射时出错来捕获不确定性