gpt4 book ai didi

c++ - 在 C++ 中使用 size_type 时,推荐使用 for 循环索引进行算术运算的方法是什么?

转载 作者:行者123 更新时间:2023-11-30 01:19:34 26 4
gpt4 key购买 nike

我的程序中有一个奇怪的错误,归结为(对我而言)在 int 和 vector::size_type 之间进行减法时的意外行为。这是一个简单的例子:

    #include <iostream>
#include <vector>

typedef std::vector<double> state_type;

int n = 1;

int main() {

state_type::size_type i = 0;
std::cout << i - n << std::endl;

}

我希望这个程序打印-1,但它打印了(在 64 位 Linux 下用 icc 14.0.1 编译):

    18446744073709551615

我目前的解释是 size_type 是无符号的,这会导致一些奇怪的(?)转换?很长一段时间后我才发现这个错误,我很惊讶会发生这种情况。现在我的问题是如何避免这些类型的错误,假设在一些 for 循环中迭代 std::vector:

   int n = 2;
for(state_type::size_type i = 0; i < my_vec.size(); ++i) {
if(i - n >= 0)
my_vec[i - n] += 3;
}

当然我可以把 i 当作一个 int,但是不建议对这种循环使用 size_type 吗?什么是更好的方法呢?还是我是唯一对这种转变感到惊讶的人?

最佳答案

这是 C++ 标准库中的一个设计缺陷。未签名的C++ 中的类型有点特殊,不应该用于算术量。有符号和无符号混合的方式是均匀的更特殊,更应该避免。解决办法是不使用 size_tsize_type 类型定义,除了极其有限的情况下,显式转换的返回值container::size() 等为有符号整数类型。 (多数情况应用程序,int 是安全的;如有疑问,ptrdiff_t 可以是用于避免溢出。)

关于c++ - 在 C++ 中使用 size_type 时,推荐使用 for 循环索引进行算术运算的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20700224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com