【问题标题】:check which vector an iterator belongs to检查迭代器属于哪个向量
【发布时间】:2018-06-11 06:55:09
【问题描述】:

我有 3 个迭代器,它们属于 3 个向量 A、B 和 C。使用这 3 个迭代器调用函数 minn,它返回具有最小值的迭代器。现在我怎么知道返回的迭代器 minit 属于哪个向量? 代码 -

vector<int>::iterator a = A.begin(), b = B.begin(), c = C.begin();
auto minit = minn(a,b,c);

【问题讨论】:

  • 这有关系吗?为什么需要这个功能?这可能有助于更好地理解您的问题。在任何情况下,您都可以使用std::pair
  • 您必须手动记录。见stackoverflow.com/q/11445025/5376789
  • 我需要这个,以便我可以增加具有最小值的特定迭代器。
  • 你说的具有最小值的迭代器是什么意思?你能举一个带有样本输入的小例子吗?可能是XY Problem
  • 我需要比较这 3 个值,计算 3 个迭代器的最大值和最小值之差,然后递增最小的那个,然后再次按照相同的步骤操作,直到其中一个迭代器达到向量的结尾。

标签: c++ vector iterator


【解决方案1】:

最简单的选择是不按值传递这些迭代器,因此当您修改minit 时,选择abc 中的任何一个也会发生变化。

bool itLess(std::vector<int>::iterator& l, std::vector<int>::iterator& r)
{
    return *l < *r;
}

for (
    auto a = A.begin(), b = B.begin(), c = C.begin(); 
    a != A.end() && b != B.end() && c != C.end();
    )
{
    auto [minit, maxit] = std::minmax({std::ref(a), std::ref(b), std::ref(c)}, itLess);
    // use minit.get() and maxit.get()
}

See it on coliru

【讨论】:

  • for 循环 + 引用返回对我有用。后来我尝试使用您使用的 minmax 函数,但它会引发错误 - “模板参数的数量错误(2,应该是 1)”和“没有匹配函数调用 'minmax<:vector>::iterator&, bool(std::vector::iterator&, std::vector::iterator&)>(, bool (&)(std::vector::iterator&, std::vector::iterator&))' "
  • 啊,我在猜测没有编译器的语法。切换到std::reference_wrappers 修复它
【解决方案2】:

我们可以利用向量将其元素存储在单个连续数组中这一事实。 我们可以检查迭代器指向的元素是否位于该数组的开头和结尾之间的内存中。

template<typename T>
bool isFromVector(const typename std::vector<T>::const_iterator &i, const std::vector<T> &v)
{
    const T *const dataBeginning = v.data();
    const T *const dataEnd = v.data() + v.size();
    const T *const element = &*i;
    return std::less_equal<const T*>()(dataBeginning, element) && std::greater<const T*>()(dataEnd, element);
}

【讨论】:

  • 你不能这样做,因为 &lt;=&gt; 对于来自不同数组的指针是未定义的。您需要使用std::greaterstd::less_equal [expr.rel]
  • @Caleth 看起来你是对的:stackoverflow.com/a/9086675/3052438。虽然,我认为普通运算符在大多数情况下都可以工作,而标准中的这些条款是针对一些不寻常的内存布局的情况。 (我已经测试了我的代码。)无论如何,我会改进我的答案。
  • @Caleth 完成。天哪,这种语法很奇怪。
  • 当它们用作参数时,语法会更好,尤其是在 C++14 中,例如std::sort(first, last, std::greater&lt;&gt;{})
猜你喜欢
  • 1970-01-01
  • 2017-08-29
  • 2021-06-19
  • 1970-01-01
  • 2019-10-17
  • 2018-03-20
  • 2013-05-06
  • 2011-11-15
相关资源
最近更新 更多