【发布时间】:2016-08-02 02:09:16
【问题描述】:
我对相同大小的列表使用了 boost zip 迭代器,不小心我传递了不同大小的列表进行迭代。我们可以为两种不同的大小使用 boost zip 迭代器,如果不能,那么在 boost 或 c++ 中还有其他选择吗?
【问题讨论】:
-
这样的迭代器如果在其中一个序列中遇到 end() 应该是什么行为?
我对相同大小的列表使用了 boost zip 迭代器,不小心我传递了不同大小的列表进行迭代。我们可以为两种不同的大小使用 boost zip 迭代器,如果不能,那么在 boost 或 c++ 中还有其他选择吗?
【问题讨论】:
根据source code,我们可以确定以下事实。
如果迭代器元组中的所有迭代器都相等,则两个 zip 迭代器相等。
推进 zip 迭代器意味着推进迭代器元组中的所有迭代器。
解引用返回从迭代器元组中解引用的迭代器构建的元组。
当您迭代(将您作为结束条件与 boost::make_zip_iterator(boost::make_tuple(end1, end2)) 之类的比较)并到达列表之一时,循环不会终止(参见 1),导致无效的取消引用(参见 3)。
您应该找到两个列表的共同长度(例如std::min(list1.size(), list2.size())并初始化结束迭代器,使两个范围的长度相等。
【讨论】:
boost::adaptors::sliced 将您的组合范围限制为最小尺寸。