检查迭代器属于哪个向量

时间:2018-06-11 06:55:09

标签: c++ vector iterator

我有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);

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在您的特定情况下,返回带有迭代器的std::pair和一个标记所选参数的整数可以解决问题。实际上你只能返回整数,然后调用者就可以使用适当的迭代器 - 这可以将它扩展为迭代器的向量/数组。

虽然这样做可能有点糟糕。如果你需要对这个特定的迭代器做一些事情,那么只需通过引用返回迭代器本身,然后这样做:

vector<int>::iterator& minn(vector<int>::iterator& A, vector<int>::iterator& B, vector<int>::iterator& C) {
    ...
    //Assuming you found the minimal position in each iterator, just return the correct reference
    if (*A < *B)
        if (*A < *C) return A;
    if (*B < *C) return B;
    return C;

//inside caller
...
vector<int>::iterator& minit = vector<int>::iterator(A,B,C);
minit++;

可以正常工作,无需在您的代码中明确写入您正在处理的矢量。         ...

(例如++minit)没有在代码中显式写入迭代器。事实上,您可能希望在minn内部执行此操作。

答案 2 :(得分:0)

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

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);
}