小议size_t和size_type

时间:2022-11-25 17:06:28

偶尔在代码中中看到string::size_type,以前只用过size_t,很奇怪二者之间的关系。

首先在c语言中,已经有size_t类型了,该类型是sizeof()操作符(注意sizeof()不是函数)的返回值类型,编译器在实现的时候通常size_t类型设置为unsigned int型。

而C++中,string类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关,size_type就是这些配套类型中的一种。string.find()函数的返回值就是size_type类型,注意下面的程序:

1 string::size_type index = str.find("tag");
2 if (index == string::npos)
3     do_someting();

The string class provides six search functions, each named as a variant of find. The operations all return a string::size_type value that is the index of where the match occurred, or a special value named string::npos if there is no match. The string class defines npos as a value that is guaranteed to be greater than any valid index.

string::npos是一个与机器无关的常量,注意size_type不要和int类型混用,如果将index类型换成int,可能会导致不可预料的错误。(ps:string::npos 一般被设置成 -1)

以下代码可以具体查看本地机器中,size_t和size_type的具体实现。

 1 #include<iostream>
 2  #include<vector>
 3  #include<typeinfo>
 4  
 5  using namespace std;
 6  
 7  int main()
 8  {
 9      cout << "typeid(size_t).name() = " << typeid(size_t).name() << endl;
10      cout << "typeid(vector<int>::size_type).name() = "
11           << typeid(vector<int>::size_type).name() << endl;
12      return 0;
13  }

 运行程序,可以看出二者的类型实际上是一样的。