2014-12-23 2 views
2

Я попытался сделать пользовательский итератор для 2D-массива, чтобы перебирать его по столбцу. то, что я хочу достичь этим тестом, заключается в том, чтобы манипулировать значениями 2d массива. , например, этот сценарий с получением из положить:пользовательский итератор для 2D-массива

0 1 2 
3 4 5 
6 7 8 

по помощи столбца итератора и std::reverse я могу манипулировать 2d массив, чтобы получить из положить, как этот

6 1 2 
3 4 5 
0 7 8 

однако. такой же результат можно выполнить с помощью std :: swap. поэтому я повторил тестовый сценарий путем свопинга, но он терпит неудачу.

мой вопрос, является ли своп для любого класса итератора просто манекеном функции-члена?

template<typename Container> 
class Columniterator : public std::iterator<std::random_access_iterator_tag, 
    typename std::decay<decltype(std::declval<Container>()[0][0])>::type> 
{ 
    using iterator = typename Container::iterator; 
    using type = typename std::decay<decltype(std::declval<Container>()[0][0])>::type; 
public: 

    Columniterator(iterator _it, size_t _i) 
     : it(_it), i(_i) 
    {} 

....

много кода бла бла

....

void swap(Columniterator& other) 
    { 
     using std::swap; 
     swap(it, other.it); 
    } 
private: 
    iterator it; 
    size_t i; 
}; 

тестовый код

//std::reverse(Columniterator<Container>(container.begin(),0), Columniterator<Container>(container.end(), 0)); // passed 
    std::swap(Columniterator<Container>(container.begin(),0), Columniterator<Container>(container.end(), 0)); // failed 

ответ

3

Ваш тест попробуйте заменить временные; использовать переменную вместо того, чтобы:

auto begin0 = begin(matrix, 0); 
auto end0 = end(matrix, 0); 

begin0.swap(end0); 

или обеспечить swap перегрузку со ссылкой RValue.

+0

свой код, я просто попытался добавить swap к нему. но, похоже, не будет – MORTAL

+1

@MORTAL: вы можете добавить информацию о том, что не работает: нет информации в вопросе и в обоих ответах. Это поможет нам вам помочь. – Jarod42

Смежные вопросы