int main()
{
string str("Hello World!\n");
cout << "The size of " << str << "is " << str.size()
<< " characters, including the newline" << endl;
return ;
}

从逻辑上来讲,size()

成员函数似乎应该返回整形数值,或是无符号整数。但事实上,size 操作返回的是 string::size_type 类型的值。

   string 类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关(machine-independent)。size_type 就是这些配套类型中的一种。它定义为与 unsigned 型(unsigned int 或 unsigned long)具有相同的含义,而且可以保证足够大能够存储任意 string 对象的长度。为了使用由 string 类型定义的 size_type 类型是由 string 类定义。任何存储string的size操作结果的变量必须为string::size_type 类型。特别重要的是,还要把size的返回值赋给一个 int 变量。

虽然我们不知道 string::size_type 的确切类型,但可以知道它是 unsigned 型。对于任意一种给定的数据类型,它的 unsigned 型所能表示的最大正数值比对应的 signed 型要大一倍。这个事实表明 size_type 存储的 string 长度是 int 所能存储的两倍。

使用 int 变量的另一个问题是,有些机器上 int 变量的表示范围太小,甚至无法存储实际并不长的 string 对象。如在有 16 位 int 型的机器上,int 类型变量最大只能表示 32767 个字符的 string 对象。而能容纳一个文件内容的 string 对象轻易就会超过这个数字。因此,为了避免溢出,保存一个 stirng 对象 size 的最安全的方法就是使用标准库类型 string::size_type

 string str("some string");
for (string::size_type index = ; index != str.size(); ++index)
cout << str[index] << endl;

来自http://blog.sina.com.cn/s/blog_4cb9953f0100duon.html

=================================================================================================

相同知识点介绍文章:

来自http://xueqi.iteye.com/blog/1569713

从逻辑上来讲,size()成员函数似乎应该返回整型数值,或如2.2节“建议”中所述的无符号整数。但事实上,size操作返回的是string::size_type类型的值。我们需要对这种类型做一些解释。

string类类型和许多其他库类型都定义了一些伙伴类型(companion
types)。这些伙伴类型使得库类型的使用是机器无关的(machine-independent)。size_type就是这些伙伴类型中的一种。它
定义为与unsigned型(unsigned int或unsigned
long)具有相同的含义,而且可以保证足够大可存储任意string对象的长度。为了使用由string类型定义的size_type类型,程序员必须
加上作用域操作符来说明所使用的size_type类型是由string类定义的。

任何存储string的size操作结果的变量必须为string::size_type类型。特别重要的是,不要把size的返回值赋给一个int变量。

虽然我们不知道string::size_type的确切类型,但可以知道它是unsigned型(2.1.1节)。对于任意一种给定的数据类型,它的
unsigned型所能表示的最大正数值比对应的signed要大一倍。这个事实表明size_type存储的string长度是int所能存储的两倍。

使用int变量的另一个问题是,有些机器上int变量的表示范围太小,甚至无法存储实际并不长的string对象。如在有16位int型的机器上,int
类型变量最大只能表示32767个字符的string对象。而能容纳一个文件内容的string对象轻易就会超过这个数字。因此,为了避免溢出,保存一个
string对象size的最安全的方法就是使用标准库类型string:: size_type。

--------------------------------------------------------------------------------------------------------

所有的查找函数都返回一个size_type类型,这个返回值一般都是所找到字符串的位置,如果没有找到,则返回string::npos
。有一点需要特
别注意,所有和string::npos的比较一定要用string::size_type来使用,不要直接使用int 或者unsigned
int等类型。

--------------------------------------------------------------------------------------------------------

问题起源于这样一段代码:

01
#include <algorithm>

02
#include <stdio.h>

03

04
int
main()
05
{
06
    size_t indexs = -1;
07
    size_t ps = 100;
08
   
int
index = -1;
09
   
int
p = 100;
10
    printf("%d\n",std::min(p,index));
11
    printf("%d\n",std::min(ps,indexs));
12
   
return
0;
13
}

其实是很简单的题目,不过要对size_t类型有一个了解才行。

关于size_t的来源

数据类型"socklen_t"和int应该具有相同的长度。否则就会破坏
BSD套接字层的填充.POSIX开始的时候用的是size_t, Linus Torvalds(他希望有更多的人,但显然不是很多)
努力向他们解释使用size_t是完全错误的,因为在64位结构中
size_t和int的长度是不一样的,而这个参数(也就是accept函数的第三参数)的长度必须和int一致,因为这是BSD套接字接口标准.最终
POSIX的那帮家伙找到了解决的办法,那就是创造了一个新的类型"socklen_t".Linux
Torvalds说这是由于他们发现了自己的错误但又不好意思向大家伙儿承认,所以另外创造了一个新的数据类型 。

size_t在C语言中就有了,size_t和ssize_t是ANSI C提供的标准头文件里定义的一个"数据类型",其实并不是新的数据类型,不是关键字,是通过typedef从已有数据类型定义而来。

ANSI C总共提供了24个头文件。

<cstddef>里这么定义了

#include <stddef.h>

using ::size_t

using::ptrdiff_t

在/usr/lib/gcc/i486-linux
-gnu/4.4/include下面

<stddef.h>里面我找到了这么几句:

#ifndef __SIZE_TYPE__

#define __SIZE__TYPE__ long unsigned int

#endif

#if !(defined(__GUNU__) && defined (size_t))

typedef __SIZE_TYPE__ size_t;

#ifdef __BEOS

typedef long ssize_t

没太看明白,不过从网上找到了不错的一个解释

size_t是为了方便系统之间的移植而定义的。

在32位系统上定义为 unsigned int

在64位系统上定义为 unsigned long

更准确的说法是在32位系统上是32位无符号整型

在64位系统上是64位无符号整型

size_t一般用来表示一种计数,比如有多少东西被拷贝等。

sizeof操作符的结果类型是size_t,

该类型保证能容纳实现所建立的最大对象的字节大小。

它的意义大致是"适于计量内存中可容纳的数据项目的个数的无符号整数类型"。

所以,它在数组下标和内存管理函数之类的地方广泛使用

ssize_t:

这个数据类型用来表示可以被执行读写操作的数据块的大小。它和size_t类似,但必须是signed。

再来看下size_t与size_type的区别

我觉得有一句话总结的很好:

size_t是全局的,而size_type是跟容器相关的。

找了下相关的文件:

/c++
/4.3/bits/stl_tree.h,stl_list.h,stl_deque.h等直接这么定义了

typedef size_t size_type

stl_mutiset.h则这么定义的:

typedef typename _Rep_type::size_type size_type;

那么size_type到底是一种什么样的类型呢?

string类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关。size_type就是这些配套类型中的一种。

size_type被定义为与unsigned型(unsigned int, unsigned
long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。为而来使用由string类型定义的size_type类型。程序员
必须加上作用于操作符来说明所使用的size_type类型是由string类定义的。

我们为什么不适用int变量来保存string的size呢?

使用int变量的问题是:有些机器上的int变量的表示范围太小,甚至无法存储实际并不长的string对象。如在有16位int型的机器
上,int类型变量最大只能表示32767个字符的string对象。而能容纳一个文件内容的string对象轻易就能超过这个数字,因此,为了避免溢
出,保存一个string对象的size的最安全的方法就是使用标准库类型
string::size_type
().

一点注意
:虽然是在学习标准库string的时候巧遇了size_type类型,但是,其实vector库也可以定义size_type类型,在vector库中还有一个difference_type类型,该类型用来存储任何两个迭代器对象间的距离,所以是signed类型的。

啰啰嗦嗦说了这么多,其实关于这个问题文章里红字标注的部分就足够了。其他的看下加深印象即可,最开始的程序结果输出为:

-1 100。

====================================================================================

下面来自:http://www.cnblogs.com/debuging/archive/2012/07/27/2612090.html

关于string::size_type

size_type其实是string模板类定义的一种类型之一,它与 size_of的用法相似,只是它根据存储的类型返回字符串的长度.对于 string具体化,将根据char返回字符串的长度,在这种情况下,size_type与size_of等效.size_of是一种无符号类型.  
你说的   size_type   其实就是   unsigned   int   类型   其实并不正确,它要看其存储的类型.

size_type实际上是做为解决string类设计上的严重失误而引入的。

size_type是在string类内定义的一个无符号整形类型,由于string类里很多方法的返回值都是size_type类型的,所以必须使用size_type进行类型声明。
如下:
string   a= "abcdefg ";
string::size_type   idx;
idx   =   a.find( "h ");   //not   found,return   string::npos
if(   idx   ==   string::npos   )     //check   if   not   find
{
  .....
}

由于npos为find返回的特殊值(-1),而不幸的是,size_type类型为unsigned   int,所以
不同的编译器对npos的理解不同。
试想一下,用8字节来unsigned   int   来表示-1和用4字节表示,值是完全不同的。
这可能是string类设计时的一个致命缺陷,为了兼容和可移植性,
特定义size_type类型,在不同编译器中,size_type的解释也不同,这样就做到了可移植。

以上内容可见
STL:11.2.12节。

C++ string::size_type 类型【转】的更多相关文章

  1. C语言 string::size_type类型

    string::size_type类型 从逻辑上来讲,size()成员函数似乎应该返回整型数值,或如2.2节“建议”中所述的无符号整数.但事实上,size操作返回的是string::size_type ...

  2. string::size_type类型

    string::size_type类型 对于string中的size函数,size函数返回的是string对象的字符个数(长度),我们知道,对size()来说,返回一个int或者是一个unsigned ...

  3. C++ string::size_type

    从逻辑上讲,size()成员函数应该似乎返回整型数值,但事实上,size操作返回是string::size_type类型的值.string类类型和其他许多库类型都定义了一些配套类型(companion ...

  4. size_type类型

    由string类类型和vector类类型定义的类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型 string::size_type它 ...

  5. string::size_type 页73 size_t 页90

    异同点: size_t size_type sizeof(XXX)所得到的结果的类型就是 string类类型和vector类类型定义的类型,string的size操作返回来的是string::size ...

  6. size_t和size_type类型

    size_t一般用来表示一种计数,比如有多少东西被拷贝等.例如:sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小. 它的意义大致是“适于计量内存中可容纳的数据 ...

  7. 关于string::size_type

    size_type其实是string模板类定义的一种类型之一,它与size_of的用法相似,只是它根据存储的类型返回字符串的长度.对于 string具体化,将根据char返回字符串的长度,在这种情况下 ...

  8. JavaScript数据类型 String字符串类型

    前言 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串String是javascript基本数据类型,同时javascript也支持 ...

  9. redis:string字符串类型的操作

    1. string字符串类型的操作: 1.1. set 设置单个值 语法:set key value [EX seconds] [PX milliseconds] [NX|XX] 注: EX seco ...

随机推荐

  1. iOS开发之修改动画对象的元素属性

    步骤:1.使用single view application创建新的项目 2.在.h文件中使用UIimageview创建两个图片实例对象,使用UIDynamicAnimator创建动画对象 3.在.m ...

  2. php大力力 [032节] php设计时候遇见麻烦:XQB50-H8268 进水电磁阀

    海信洗衣机 无法进水,刚才写程序,洗衣机不进水,在叫唤,去看了看,上网查了查,估计是进水电磁阀坏了. 打算自己拆了查出型号,淘宝买,自己修. 想起以前洗衣机坏了,找人修,对方报价好几百,淘宝看洗衣机主 ...

  3. javaweb-c3p0

    //c3p0-config.xml <?xml version="1.0" encoding="UTF-8"?><c3p0-config> ...

  4. 转载 javascript中的正则表达式总结 二

    学习正则表达式 今年的第一篇javascript文章就是这个正则表达式了,之前的文章是转载别人的,不算自己的东西,可以忽略不计,最近突然想把转载别人的东西 统统删掉,因为转载过的文章,我根本没有从中获 ...

  5. svn认证失败时的解决

    删除用户目录下的.subversion文件夹,这个文件夹记录了密码! rm .subversion/ -rf

  6. 转:SSL协议详解

    http://kb.cnblogs.com/page/162080/ 背景介绍    最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. 在开始SS ...

  7. Linux关机命令

    1.halt  :关机 init 0 : 关机 shutdown  -h  now (立刻关机)  -h 指的是  halt 2.reboot  重启 init 0 重启 shutdown -r no ...

  8. 常用http请求状态码含义

    1**  ----临时响应 2**  ----成功响应 3**  ----重定向 4**  ----请求错误 5**  ----服务器错误 常用的几个如下: 200---服务器成功返回网页 301-- ...

  9. Codeforces Round #375 (Div. 2) A B C 水 模拟 贪心

    A. The New Year: Meeting Friends time limit per test 1 second memory limit per test 256 megabytes in ...

  10. html5的程序接口与元素变化

    除了原先的DOM接口,HTML5增加了更多API,如:1. 用于即时2D绘图的Canvas标签2. 定时媒体回放3. 离线数据库存储4.文档编辑5. 拖拽控制6. 浏览历史管理元素变化新的解析顺序新的 ...