2016-06-30 1 views
0

Alles, ich versuche, einen O (n^2) Vergleich zwischen Elementen in einer Liste in umgekehrter Reihenfolge, also verwende ich einen Reverse-Iterator.Reverse Iterator Arithmetic

-Code folgt

#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); 
} 

ich einen Compiler-Fehler erhalten auf der searchIter Kreation ... warum ...

Dies funktioniert, aber seine dumm zu lesen:

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

} 

Fehler unten:

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); } 
+0

Was ist der Fehler? – NathanOliver

Antwort

5

Die Syntax it + n für einige Iteratoren it und ganze Zahlen n erfordert, dass der Iterator ein "Random Access Iterator" ist. Listeniteratoren erfüllen diese Anforderung nicht.

Um das zu bekommen Ausgabe "dumm zu lesen", Sie std::next verwenden können:

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

Oder mit weniger Tipp:

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

Leider darf ich C++ 11 nicht verwenden, weil [redigiert] ... aber das war sehr intuitiv. Vielen Dank! – Constantin

+0

@Constantin Gern geschehen. Die Umsetzung von "next" sollte nicht zu schwer sein. :) –