size()函数计算stirng类型长度的用法,注意返回值为size_type类型
2012-02-14 12:10
381 查看
从逻辑上讲,size()成员函数似乎应该返回整型数值,但事实上,size操作返回的是string::size_type类型的值。我们需要对这种类型做一些探讨。
string 类类型和许多其他库类型一样都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关(machine-independent)。size_type就是这些配套类型中的一种。它定义为与unsigned(unsigned int 或 unsigned long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。为了使用由string类型定义的size_type类型,程序员必须加上作用域操作符来说明所使用的 size_type类型是由 string类定义的。
虽然我们不知道string::size_type的确切类型定义,但是可以指到它是unsigned型。对于任意一种给定的数据类型,它的unsigned 型所能表示的最大正整数比对应的signed 型要大一倍。比如 unsigned int 所表达的最大整数数值就为 signed int 型所能表示的最大整数的两倍,这是因为在unsigned int 中,最高位为符号位,表示这个数的正负,unsigned int为4字节,而表示这个数的数值的位数就只有剩下的15位了;对于unsigned int 来说,它也是一个4字节的,但是它的所有16为都用来表示这个数的数值大小,而且它只能表示正数。这个事实就表明,size_type存储的string长度是int所能存储的两倍。
使用int来表示string类型长度还有另一个问题,有些机器上int变量的表示范围太小,甚至无法存储实际并不长的string对象。例如在有的机器上,int类型只有两字节,即16位大小,而16位能表示的最大正整数只有32767,如果我们把一个文件中的所有字符全部保存到一个string类型中,那么很可能就会超过这个最大长度。因此,为了避免溢出,保存一个string对象的size的最安全的方法就是使用标准类型库string::size_type。
例如:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string strTest("This is a string!");
string::size_type length = strTest.size();
cout<<"The size of strTest is: "<<length<<endl;
}
string 类类型和许多其他库类型一样都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关(machine-independent)。size_type就是这些配套类型中的一种。它定义为与unsigned(unsigned int 或 unsigned long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。为了使用由string类型定义的size_type类型,程序员必须加上作用域操作符来说明所使用的 size_type类型是由 string类定义的。
虽然我们不知道string::size_type的确切类型定义,但是可以指到它是unsigned型。对于任意一种给定的数据类型,它的unsigned 型所能表示的最大正整数比对应的signed 型要大一倍。比如 unsigned int 所表达的最大整数数值就为 signed int 型所能表示的最大整数的两倍,这是因为在unsigned int 中,最高位为符号位,表示这个数的正负,unsigned int为4字节,而表示这个数的数值的位数就只有剩下的15位了;对于unsigned int 来说,它也是一个4字节的,但是它的所有16为都用来表示这个数的数值大小,而且它只能表示正数。这个事实就表明,size_type存储的string长度是int所能存储的两倍。
使用int来表示string类型长度还有另一个问题,有些机器上int变量的表示范围太小,甚至无法存储实际并不长的string对象。例如在有的机器上,int类型只有两字节,即16位大小,而16位能表示的最大正整数只有32767,如果我们把一个文件中的所有字符全部保存到一个string类型中,那么很可能就会超过这个最大长度。因此,为了避免溢出,保存一个string对象的size的最安全的方法就是使用标准类型库string::size_type。
例如:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string strTest("This is a string!");
string::size_type length = strTest.size();
cout<<"The size of strTest is: "<<length<<endl;
}
相关文章推荐
- iOS 字符串长度计算boundingRectWithSize遇到 " \r\n"的时候,后面的字符串长度返回0 在swift中使用pod导入第三方库时,注意事项
- 关于返回一个引用类型的函数的用法和见解
- C++11用于计算函数对象返回类型的统一方法
- c语言不同类型返回数组长度用法
- 利用函数重载分别创建三个函数,分别是计算2个数的和,3个数的和,4个数的和/利用函数重载分别创建三个函数,分别计算int类型数组中最大值,stirng 类型数组中最长的字符串,double类型数组中最
- 实验5(2)编制程序,输入m、n(m≥n≥0)后,计算下列表达式的值并输出。 要求将计算阶乘的运算编写作函数fact(n),函数返回值的类型为float
- 函数重写(override)与协变返回类型(covariant return type)
- C++11 理解 (二十八) 之 用于计算函数对象返回类型的统一方法
- “函数的返回类型为引用”用法解析
- C++基础::语法特性::函数重写(override)与协变返回类型(covariant return type)
- 关于vector.size()和string.length() 的返回类型 size_type
- C++函数返回迭代器类型时应注意的点
- 实验5-2: 编制程序,输入m、n(m≥n≥0)后,计算下列表达式的值并输出。 要求将计算阶乘的运算编写作函数fact(n),函数返回值的类型为float
- JAVA调用DOTNET写的返回为DataSet类型的WebService函数出错 [cvc-complex-type.4:Attribte 'part' must appear on element 'mime:content'.]
- 宏定义函数指针类型&函数返回左值类值 1。宏定义不分配内存,变量定义分配内存。 2。宏名和参数的括号间不能有空格 3。宏替换只作替换,不做计算,不做表达式求解 //下面是正确的标准的写法 typedef int(FUNC1)(int in); ty
- 实验5-2 编制程序,输入m、n(m≥n≥0)后,计算下列表达式的值并输出。 要求将计算阶乘的运算编写作函数fact(n),函数返回值的类型为float。
- 分享:sp_type返回表结构字段类型及长度等
- 函数返回类型为指针的时候的注意事项
- 写正确函数需要注意的地方:在字符串中找出连续最长的数字串,并把这个串的长度返回
- iconv 函数总返回 -1 的原因之一: 注意在32位和64位机上 int 和 size_t 的字节数是不同的。