1
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().

这是怎么回事?我如何解决它?

4

2 回答 2

2

_这将返回:的副本[](const auto& _) {return _; }

我没有查看代码,但如果迭代器在每次取消引用上应用转换,我一点也不感到惊讶,这意味着每次取消引用result.begin()(使用->)时,您都会得到向量的不同副本。不同向量的迭代器彼此不可比较。

于 2017-06-28T08:08:39.247 回答
-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));

它没有,因为最重要的等于最前面存储的整数。

让我知道这里是否还有其他未提及或未明确理解的内容。

于 2017-06-28T16:21:52.870 回答