如何通过引用迭代器的解引用使幂等性
How to make idempotent taking a reference to a dereference of an iterator
下面的代码(-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;
}
问题无法解决。有三个原因无法解决。
第一个问题
需要重载的operator &
是向量元素类型的operator &
。您不能为任意类型重载operator &
,特别是不能为内置类型重载它(如示例中的int
)。
第二个问题
假设您希望这适用于std::vector
、std::array
和内置阵列?也可能是std::list
、std::deque
等?你不能。每个包含的迭代器都是不同的(在实践中:在理论中,它们中的一些可以共享迭代器,但我不知道它们有任何标准库。)
第三个问题
如果您准备接受这只适用于std::vector<MyType>
,那么您可以重载MyType::operator &
,但仍然无法计算出MyType
对象所在的std::vector<MyType>
(您需要它来获得迭代器)。
首先,在您的代码片段中,i
推导为std::vector<int>::iterator
,j
推导为int*
。编译器不知道如何将std::vector<int>::iterator
与int*
进行比较。
为了实现这一点,您可以提供一个重载的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;
}
实时演示
这不应该起作用,甚至"符合‘天真’视图"也不应该。尽管每个指针都是迭代器,但反过来不一定是真的。你为什么希望它起作用?
它将在两种情况下工作:
-
std::vector<T>
实现的iterator
实际上是T*
。那么您的代码将从decltype(i) == int*
和decltype(j) == int*)
开始工作。某些编译器可能会出现这种情况,但如果编译器确实存在这种情况,您甚至不应该依赖它。 -
解引用运算符不返回类型为
T
的对象,而是返回可转换为T
的对象,并且具有重载的operator&
,从而返回迭代器。事实并非如此,原因很充分。
正如其他人所建议的那样,您可以重载operator==
来检查两个间接方法(指针和迭代器)是否引用了同一个对象,但我怀疑您希望运算符的地址返回迭代器,如果迭代器不是指针,则无法实现,因为存储在向量中的对象类型没有向量/迭代器或其他概念。
问题不在等式运算符中,我需要的是定义解引用运算符来给出迭代器
你不能。有问题的解引用运算符是std::vector<int>::iterator
,它是标准库的一部分,您可以(也不应该)操作它
注意,由于std::vector<T, A>
中的C++11,
- CCD_ 31是CCD_
- 33是CCD_ 34
此外,以下情况也是正确的:
- 所有输入迭代器
i
都支持*i
,它提供类型为T
的值,CCD_37是该迭代器的值类型 std::vector<T>
的迭代器需要将T
作为其值类型std::vector<T>
的迭代器是输入迭代器
- Ctypes wstring通过引用传递
- 为什么我可以通过引用修改常量返回
- 在 const 函数中通过引用和指针返回之间的区别
- 智能指针作为无序映射键,并通过引用进行比较
- 如何通过引用返回对象
- 通过常量引用传递参数的矩阵模板类
- 通过引用传递-为什么要调用这个析构函数
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- 如何传递带有通过引用传递的结构参数的函数?
- 我如何通过引用将 c++ 字符串分配给另一个字符串
- 为什么我在函数中使用引用并通过引用返回它仍然有效?
- 如何从常量引用或通过转发模板临时构造对象
- 包含仅移动类型的类的构造函数应通过引用还是通过右值引用接收仅移动类型?
- 在C++中,通过引用和通过值将向量传递到函数中
- *val 和 &val 在 C++ 中通过引用传递时有何不同
- 迷失在通过引用、通过值传递的参数中
- 通过引用与通过值传递指向函数的指针,以及在指针链上使用delete
- 在接收到r值引用后通过引用传递
- 为什么引用在通过指针完成时会中断
- 复制赋值运算符应该通过常量引用还是通过值传递