【问题标题】:compare nested iterators after boost transformed()在 boost transform() 之后比较嵌套的迭代器
【发布时间】:2023-03-09 01:27:01
【问题描述】:
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&amp; _Right) 中触发此错误:

        _DEBUG_ERROR("vector iterators incompatible");

这很重要,因为Flattening iteratoradvance_past_empty_inner_containers() 中使用了这种比较。

发生了什么事?我该如何解决?

【问题讨论】:

  • 让我知道 1 和 2 是这里比较的对象还是别的什么
  • 代码不是比喻。 1 和 2 是整数文字。
  • 好的,您的代码正在比较地址!这让我想知道这一点??

标签: c++ c++11 boost-range boost-adaptors


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    不管这段代码试图比较地址的行为如何,我都想初始化一个迭代器vector&lt;vector&lt;int&gt;&gt;::iterator以简化比较存储在第一个子集中的第一个和最后一个值的过程,最后一个应使用-&gt;rbegin()-&gt;end()-1 而不是-&gt;end() 寻址,这会导致未分配的内存跨度。

    让我重新填充你的数组, vector&lt;vector&lt;int&gt;&gt; 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));
    

    它没有,因为 foremost 等于 forelast 存储的整数。

    如果还有其他没有在这里讨论或没有清楚理解的地方,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多