Ant*_*ant 3 c++ unsigned subtraction
我正在尝试创建一个vector<string>与其迭代器类似的类和另一个类(仅作为C++ Primer的练习(对于那些感兴趣的人练习14.28)).迭代器类的工作原理是使用一个vector<string>::size_type成员(称为curr)来表示向量的索引.我不想粘贴整个作品,因为它很长,但在尝试为迭代器定义我自己的减法运算符时,我已达到某种程度的混乱.最终它应该像减去两个迭代器一样工作,并在必要时产生负值.我有这样定义的函数:
??? operator-(const iterator& lhs, const iterator& rhs){
return (lhs.curr - rhs.curr);
}
Run Code Online (Sandbox Code Playgroud)
或者,另一个版本的混乱;
#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;
}
Run Code Online (Sandbox Code Playgroud)
(y-x)-2但它当然是回绕到,4294967294因为它是一个32位无符号表达式,然后将其存储在z中.我无法弄清楚如何定义我的返回类型,以便如果rhs(y)在序列中比lhs(x)更远,则返回正确的负值(存储在z中).
我想vector<string>::difference_type可能会做那个技巧,但我发现它size_type代表一个32位无符号整数,而difference_type代表一个32位有符号整数,所以有一个错误的包含有符号整数,这是未定义的行为 - 即使在我的电脑上它产生正确的结果.我可以static_cast一切long long int并返回long long int,但我觉得这将是一个有点太野蛮强迫.
确实要使用正确的类型vector<string>::difference_type.您可以像这样轻松实现迭代器减法:
difference_type operator- (const iterator &lhs, const iterator &rhs)
{
if (rhs.curr >= lhs.curr) return static_cast<difference_type>(rhs - lhs);
else return - static_cast<difference_type>(lhs - rhs);
}
Run Code Online (Sandbox Code Playgroud)
标准库的实际实现可能不一定需要这样做,因为它们通常针对特定的编译器,并且可以使用内部知识来知道编译器如何处理实现定义的行为,例如将无符号值转换为a的结果.签名范围之外的签名类型.