我正在尝试创建一个类,类似于vector<string>
,以及另一个类,类似于它的迭代器(纯粹是从C++ Primer(对于那些感兴趣的人来说,这是练习14.28)中的练习)。 迭代器类通过具有一个vector<string>::size_type
成员(称为curr
)来表示向量的索引。 当尝试为迭代器定义自己的减法运算符时,我遇到了一些困惑。 最终,它应该像减去两个迭代器一样工作,并在必要时产生负值。 我定义的函数如下:
??? operator-(const iterator& lhs, const iterator& rhs){
return (lhs.curr - rhs.curr);
}
另一种我困惑的版本:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector<string>::size_type x = 5, y = 3;
??? z = (y-x); //what should ??? be if I want -2?
cout << z;
}
(y-x)
的值为-2
,但由于它是一个32位无符号表达式,在存储到z之前会回绕到4294967294
。我无法确定如何定义返回类型,以便在rhs(y)比lhs(x)更靠后时,返回正确的负值(存储在z中)。
我认为vector<string>::difference_type
可能会起到这个作用,但我发现size_type
表示32位无符号整数,而difference_type
表示32位有符号整数,因此使用有符号整数会产生未定义的行为-尽管在我的计算机上它产生了正确的结果。我可以将所有内容强制转换为long long int
并返回long long int
,但我觉得这样有点过于粗暴。
auto
只会将z
设置为无符号类型,这并不是我们想要的。 - AntiElephant[-INT_MAX; INT_MAX]
),您不能使用(有符号/无符号)int
。 - Jarod42