加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C vector :: size_type:signed vs unsigned; int与long

发布时间:2020-12-16 03:37:01 所属栏目:百科 来源:网络整理
导读:我一直在通过在不同平台上编译来对我的应用程序进行一些测试,而从64位系统向32位系统的转变暴露了许多问题. 我大量使用向量,字符串等,因此需要对它们进行计数.但是,我的函数也使用32位无符号数,因为在很多情况下我需要显式地使用正整数. 我遇到了看似简单的
我一直在通过在不同平台上编译来对我的应用程序进行一些测试,而从64位系统向32位系统的转变暴露了许多问题.

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

我遇到了看似简单的任务问题,例如std :: min和std :: max,这可能更系统化.请考虑以下代码:

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

看起来很简单:我知道向量不能有负数的元素,所以返回无符号整数就完全有道理了.

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字节数.

解决方案是做老式的weay:

#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则自动返回.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读