size_type与size_t的机器无关性

1、首先说下这两者之间的区别:sizetype是容器定义的类型,其使用范围在容器内,即命名空间在容器内,如STL中string类有定义string::size_type类型,vector内同样定义有vector<int>:size_type类型,它们的定义并不重复,命名空间不同罢了。而size_t类型的命名空间是全局的命名空间,全局只有一个,不能再次重复定义。

2、那么它们是什么类型呢?

      答案是不唯一的,或者说是不确定的。在win32平台下它们的定义都是unsigned int类型,在win64平台下它们的定义是unsigned long类型

3、stl为什么定义这两种类型?

     在我看来,这里有两个理由:

     (1)定义新的类型名字,一目了然,开发人员在使用容器或者需要记录其它长度或者下标值时,用这种类型的话一目了然,其它同组开发人员也可以很容易读懂其编写的代码,这就增加了程序的易读性。

     (2)上面的原因很重要,但这并不是其定义新类型的根本原因,STL定义新类型是为了实现平台的无关性,即让开发人员写出的代码具有平台无关性,可以任意在其它平台上面移植而不会出现意想不到的错误或异常。


对于上面的第二个原因有很多的同学理解的并不透彻,下面我们就看一个百度百科里提到的很简单的例子:

#include <iostream>
#include <string>

using namespace std;

int main(){

      string s; 
      intrc = s.find(/*.....*/);

      system("pause"); 
      return 0;

}

这样的代码在一般情况下是不会出问题的,因为大多数的开发都在32位平台下开发,对应的int和s.find()返回值类型相同,都是32位int类型,但是加入把上面程序放在win64平台运行的话就会出现意想不到的效果。程序很可能会崩溃。s.find()返回值为64位的unsigned long类型,显然程序有问题了。

为了避免这种情况我们应该使用统一的类型,在win32下rc应该是32位整形,在win64下rc应该是64位整形。因此rc类型应该随平台的改变而改变。这就明显需要我们定义该类型为size_t类型啦。明白了吗?




C++中的size_type是一种类型,用于表示容器的大小或索引的类型。它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。在标准库中,不同的容器可能使用不同的size_type类型来表示大小或索引。例如,vector容器使用vector::size_type来表示大小。\[1\]在string类型中,size()成员函数返回的是string::size_type类型的值,它定义为与unsigned型具有相同的含义,足够大以存储任意string对象的长度。为了使用由string类型定义的size_type类型,需要使用作用域操作符来说明所使用的size_type类型是由string类定义的。\[3\]下面是一个简单的示例代码,演示了如何使用string::size_type来遍历字符串中的字符:\[3\] ```cpp #include <iostream> #include <string> using namespace std; int main() { string str("This is a simple demo!"); for (string::size_type index = 0; index != str.size(); ++index) { cout << str\[index\]; } cout << endl; return 0; } ``` 这段代码使用了string::size_type类型的index变量来遍历字符串str中的每个字符,并将其输出到屏幕上。\[3\] #### 引用[.reference_title] - *1* [c++: size_typesize_t一些概念](https://blog.csdn.net/lzx_bupt/article/details/6558566)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++自学血汗史(八):size_type类型到底是啥](https://blog.csdn.net/Promise11161314/article/details/127106828)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [size_typesize_t、differentce_type以及ptrdiff_t](https://blog.csdn.net/liushuiwen101423/article/details/39548479)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值