c ++ std :: list проблема с компиляцией?связанные с list.end () и list.end () - 1 - PullRequest
0 голосов
/ 23 декабря 2018

В приведенном ниже коде.

int main() {
    list<int> m_list;
    m_list.push_back(1);
    list<int>::iterator it1 = (--m_list.end());   // it works, *it1 return 1;
    list<int>::iterator it2 = (m_list.end() - 1); // compile issue? 
}

Кто-нибудь объяснит, почему в списке (m_list.end () - 1) есть проблема компиляции?и почему (--m_list.end ()) в порядке?Если мы изменим на другие, вектор, строка.оба случая работают.

int main() {
    vector<int> m_vector;
    m_vector.push_back(1);
    vector<int>::iterator it1 = (--m_vector.end());   // both work
    vector<int>::iterator it2 = (m_vector.end() - 1); // both work 
}

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Кто-нибудь объяснит, почему в списке (m_list.end () - 1) есть проблема компиляции?

Поскольку итератор списка не поддерживает произвольный доступ.Только итераторы с произвольным доступом гарантированно поддерживают operator-operator+).

и почему (--m_list.end ()) в порядке?

Потому что двунаправленные итераторы поддерживают operator--operator++).Итератор списка является двунаправленным.

Если мы изменим на другие, vector, string.оба случая работают.

И вектор, и строка имеют итераторы произвольного доступа.

0 голосов
/ 23 декабря 2018

Причина этого в том, что list :: end () возвращает двунаправленный итератор , который не поддерживает такую ​​операцию.

Источник:

http://www.cplusplus.com/reference/iterator/BidirectionalIterator/

С другой стороны, vector :: end () и string :: end () возвращают итератор произвольного доступа , который поддерживает такую ​​операцию.

http://www.cplusplus.com/reference/iterator/RandomAccessIterator/

Редактировать:

Если вы действительно хотите выполнить задачу, используйте std::prev() function

list<int>::iterator it2 = (std::prev(m_list.end(), 1));

Как предложено Pete Becker , "Второй аргумент для std :: prev имеет значение по умолчанию 1"

Итак, вы можете сделать это также:

list<int>::iterator it2 = (std::prev(m_list.end()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...