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()
,
В чем дело? Как мне это исправить?
Это возвращает копию _
: [](const auto& _) {return _; }
,
Я не изучал код, но меня совсем не удивит, если итератор применяет преобразование к каждой разыменовке, а это означает, что при каждой разыменовке result.begin()
(с ->
) вы получите другую копию вектора. Итераторы в разные векторы не сопоставимы друг с другом.
Независимо от поведения этого кода, который пытается сравнить адреса, Я бы предположил инициализировать итератор 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));
Это не так, поскольку прежде всего равно переднему хранимому целому числу.
Дайте мне знать, если есть что-то еще, о чем здесь не говорится или не совсем понятно.