关于C++中string、vector、bitset和数组的size()返回类型的总结
来源:互联网 发布:adobe输出软件 编辑:程序博客网 时间:2024/05/16 04:36
《C++primer》第三和第四章分别介绍了上述四种常用复合数据类型,它们均有自己的长度,除了数组意外,其他均有本身定义的size()函数,但是size()返回类型不一样。
size_type:
由string类类型和vector类类型定义的类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型
string抽象意义是字符串, size()的抽象意义是字符串的尺寸, string::size_type抽象意义是尺寸单位类型
string::size_type它在不同的机器上,长度是可以不同的,并非固定的长度。但只要你使用了这个类型,就使得你的程序适合这个机器。与实际机器匹配。
eg:
string::size_type从本质上来说,是一个整型数。关键是由于机器的环境,它的长度有可能不同。 例如:我们在使用 string::find的函数的时候,它返回的类型就是 string::size_type类型。而当find找不到所要找的字符的时候,它返回的是 npos的值,这个值是与size_type相关的。假如,你是用 string s; int rc = s.find(.....); 然后判断,if ( rc == string::npos ) 这样在不同的机器平台上表现就不一样了。如果,你的平台的string::size_type的长度正好和int相匹配,那么这个判断会侥幸正确。但换成另外的平台,有可能 string::size_type的类型是64位长度的,那么判断就完全不正确了。 所以,正确的应该是: string::size_type rc = s.find(.....); 这个时候使用 if ( rc == string::npos )就回正确了。
st.size()表示st中的字符数量,字符数量的统计是由 1 开始累计计算的,所以字符数量正好比字符串的下标索引数(由 0 开始累计计算)大 1 ,这里的index != st.size();的效果等同于index < st.size();
size_t
size_t不是容器概念。
size_type是容器概念,没有容器不能使用。
见例程:
- #include<iostream>
- #include<vector>
- using namespace std;
- int main()
- {
- cout<<" typeid(size_t).name() = "<<typeid(size_t).name()<<endl;
- cout<<" typeid(vector<int>::size_type).name() = "<<typeid(vector<int>::size_type).name()<<endl;
- return 0;
- }
from:http://blog.sina.com.cn/s/blog_5ff6e6ed0100da4j.html
先是看到了在看标准库string时size_type,后来在学习标准库bitset的时候有碰到了size_t,晕啊
先说说是在什么样的机缘巧合下与size_type相遇的吧,O(∩_∩)O
标准库string里面有个函数size,用来返回字符串中的字符个数,具体用法如下:
string st("The expense of spirit/n");
cout << "The size of "<<st<<"is"<<st.size()
<< "characters, including the newline"<<endl;
那么size()这个函数返回的类型到底是什么呢?一定要记住,绝对不是整形,而是size_type类型的,所以千万不要把size的返回值赋给一个int变量。
那么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类型的。
什么是size_t类型呢?其实本质上和size_type没有多大区别
其实size_t和size_type类似,size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版本.它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。用法如下:
bitset<32> bitvec;
size_t sz=bitvec.size();
另外sizeof操作符的返回值的类型也为size_t哦
from:网友
- class container
- {
- public:
- typedef size_t size_type;
- //...
- 关于C++中string、vector、bitset和数组的size()返回类型的总结
- 第三章:标准库类型:string、 vector 和 bitset类型
- 关于c中&的返回值类型
- C++:标准库类型(string、vector、list、bitset)
- vector 中 size()和 capacity()的区别
- Vector 中size和 capacity的区别
- C++:string类中size()和length()的区别
- 笔记2 (标准库类型string、vector和bitset)
- 关于vector.size()返回值
- [C++ Primer Plus]学习笔记--关于C++ string和c类型字符数组的对比
- 关于C++中Size和Capacity的问题
- 关于C#string的类型
- 标准库类型:string vector bitset
- 标准库类型--string,vector,bitset
- C++STL中string和vector的用法
- vector的capacity和size
- VECTOR和BITSET部分的小知识点
- C++ string和c类型字符数组的比较
- Java 中split 方法的注意点
- hdu 4313 - Matrix(最小生成树,并查集)
- 迷宫问题,求最短路径长度、最短路径条数、所有最短路径,DFS+BFS+栈+队列
- ubuntu下使用svn管理sina 云平台的代码
- 深入剖析Struts框架原理
- 关于C++中string、vector、bitset和数组的size()返回类型的总结
- hdu 2437 (记忆化搜索)
- HSSF 字体下划线
- 二分图最大独立集-poj1466
- Oracle DB 管理还原数据
- ActiveMQ JMS Spring的一个实例
- 套接字基础
- 开始谢谢技术博客了
- 色彩