gpt4 book ai didi

C++ vector::size_type:有符号与无符号;整数与长

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:12 25 4
gpt4 key购买 nike

我一直在通过在不同平台上编译我的应用程序来对其进行一些测试,从 64 位系统到 32 位系统的转变暴露出许多问题。

我大量使用 vector 、字符串等,因此需要对它们进行计数。但是,我的函数也使用 32 位无符号数,因为在许多情况下我需要显式使用正整数。

我在处理看似简单的任务时遇到了问题,例如 std::minstd::max,它们可能更系统化。考虑以下代码:

uint32_t getmax()
{
return _vecContainer.size();
}

看起来很简单:我知道一个 vector 不能有负数的元素,所以返回一个无符号整数是完全合理的。

void setRowCol(const uint32_t &r_row; const uint32_t &r_col)
{
myContainer_t mc;
mc.row = r_row;
mc.col = r_col;
_vecContainer.push_back(mc);
}

同样,足够简单。

问题:

uint32_t foo(const uint32_t &r_row)
{
return std::min(r_row, _vecContainer.size());
}

这给我错误,例如:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:2589:1: note: candidate template ignored: deduced conflicting types for parameter '_Tp' ('unsigned long' vs. 'unsigned int')
min(const _Tp& __a, const _Tp& __b)

我做了很多挖掘,在一个平台上 vector::size_type 是一个 8 字节的数字。但是,根据设计,我使用的是无符号的 4 字节数字。这可能会导致事情变得古怪,因为您不能将 8 字节数字隐式转换为 4 字节数字。

解决方案是用老式的方法来做到这一点:

#define MIN_M(a,b) a < b ? a : b
return MIN_M(r_row, _vecContainer.size());

这很管用。但系统性问题仍然存在:在规划多平台支持时,您如何处理这样的实例?我可以使用 size_t 作为我的标准尺寸,但这增加了其他复杂性(例如,从一个支持 64 位数字的平台转移到另一个支持 32 位数字的平台)。更大的问题是 size_t 是未签名的,所以我无法更新我的签名:

size_t foo(const size_t &r_row)
// bad, this allows -1 to be passed, which I don't want

有什么建议吗?

编辑:我曾在某处读到 size_t 已签名,此后我已得到更正。到目前为止,这看起来像是我自己设计的限制(例如,32 位数字与使用 std::vector::size_type 和/或 size_t)。

最佳答案

处理这个问题的一种方法是使用

std::vector<Type>::size_type

作为函数参数/返回的基础类型,或者如果使用 C++14,则返回 auto

关于C++ vector::size_type:有符号与无符号;整数与长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44205995/

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