сравнить вложенные итераторы после boost transmed ()

vector<vector<int>> input{ { { 1, 2 },{ 3, 4 } } };
auto result = input | boost::adaptors::transformed([](const auto& _) {return _; });
result.begin()->begin() == result.begin()->end();

Если я запускаю это с VS2015 с _ITERATOR_DEBUG_LEVEL=2, то он запускает эту ошибку в _Compat(const _Myiter& _Right):

        _DEBUG_ERROR("vector iterators incompatible");

Это важно потому что Сглаживающий итератор использует это сравнение в advance_past_empty_inner_containers(),

В чем дело? Как мне это исправить?

1

Решение

Это возвращает копию _: [](const auto& _) {return _; },

Я не изучал код, но меня совсем не удивит, если итератор применяет преобразование к каждой разыменовке, а это означает, что при каждой разыменовке result.begin()->) вы получите другую копию вектора. Итераторы в разные векторы не сопоставимы друг с другом.

2

Другие решения

Независимо от поведения этого кода, который пытается сравнить адреса, Я бы предположил инициализировать итератор vector<vector<int>>::iteratorчтобы упростить процедуру сравнения первого и последнего значений, хранящихся в первом подмножестве, к последнему следует обратиться с помощью ->rbegin() или же ->end()-1 вместо ->end(), что приводит к нераспределенному объему памяти.

Позвольте мне заселить ваш массив,
vector<vector<int>> input{ { { 1, 2 },{ 3, 1 } } };

Вы либо делаете одно из них:

assert(*(result.begin()->begin()) == *(result.begin()->end() - 1));
assert(*(result.begin()->begin()) == *(result.begin()->rbegin()));

оба выдают исключения, так как 1 = / = 2

Попробуй это:

assert(*(result.begin()->begin()) == *((result.end() - 1)->end() - 1));

Это не так, поскольку прежде всего равно переднему хранимому целому числу.

Дайте мне знать, если есть что-то еще, о чем здесь не говорится или не совсем понятно.

-2