如何使幂等元素引用迭代器的解引用

时间:2016-05-07 11:59:04

标签: c++ reference iterator dereference

根据“天真”视图的下面的代码(-std = c ++ 11)应该有效。 相反它没有(应该知道并理解它为什么不)。 哪个是修改代码(重载&)的最短方式,以使其按照“天真”视图行事? 在stl对象创建期间不应该作为选项给出(没有写太多)?

#include <iostream>
#include <vector>

int main(int argc, char **argv)
{   std::vector<int> A{10,20,30};
    auto i=A.begin();
    auto j=&*i;
    std::cout<<"i==j gives "<<(i==j)<<std::endl;
    return 0;
}

3 个答案:

答案 0 :(得分:1)

问题无法解决。 三个原因无法解决。

第一个问题

您需要重载的operator &是向量的元素类型的operator &。您不能为任意类型重载operator &,特别是您不能为内置类型(例如示例中的int)重载它。

第二个问题

据推测,您希望这适用于std::vectorstd::array和内置数组吗?也可能是std::liststd::deque等?你不能。每个包含的迭代器都是不同的(实际上:在理论中,有些可以共享迭代器,但我不知道它们的标准库。)

第三个问题

如果您准备接受这只适用于std::vector<MyType>,那么您可以重载MyType::operator & - 但您仍然无法解决std::vector<MyType> MyType 1}}对象存在(并且你需要它来获取迭代器)。

答案 1 :(得分:0)

首先,在您的代码段i中扣除std::vector<int>::iteratorj扣除int*。编译器不知道如何将std::vector<int>::iteratorint*进行比较。

为了解决这个问题,您可以提供一个重载的operator==,它将以下列方式将向量迭代器与向量值类型指针进行比较:

template<typename T>
bool operator==(typename std::vector<T>::iterator it, T *i) {
  return &(*it) == i;
}

template<typename T>
bool operator==(T *i, typename std::vector<T>::iterator it) {
  return it == i;
}

Live Demo

答案 2 :(得分:0)

这不应该工作 - 甚至不应该按照一个天真的&#34;&#39;视图&#34 ;.尽管每个指针都是迭代器,但反过来不一定正确。你为什么期望这样做?

它可以在两种情况下工作:

  1. iterator实施的std::vector<T>实际上是T*。然后,您的代码将在decltype(i) == int*decltype(j) == int*)之后生效。对于某些编译器来说可能就是这种情况,但如果编译器确实如此,你甚至不应该依赖它。

  2. 取消引用运算符不会返回类型为T的对象,而是可以转换为T且具有重载operator&的对象,这会使迭代器返回。情况并非如此。

  3. 你可以 - 其他人建议 - 重载operator==来检查两个间接(指针和迭代器)是否引用相同的对象,但我怀疑你想要运算符的地址给你回到不能的迭代器如果迭代器不是指针,则完成,因为存储在向量中的对象类型没有vector / iterator或者其他任何概念。

      

    问题不在于等于运算符,我需要的是定义解引用运算符以给出迭代器

    你不能。有问题的解除引用运算符是std::vector<int>::iterator,它是标准库的一部分,您可以(而且不应该)操纵它。

    请注意,因为std::vector<T, A>中的C ++ 11,

    • value_typeT
    • referenceT&

    此外,以下情况属实:

    • 所有输入迭代器 i 支持 *i ,它提供类型为T的值是该迭代器的值类型
    • std::vector<T>的迭代器需要T作为值类型
    • std::vector<T>的迭代器是输入迭代器