string.size()和size_type

写一道小题目时发现了一个隐蔽错误,之前也没有在意过。就是string.size()返回的是size_type类型,而size_type等同于unsigned int

那道小题目如下:

当时写的代码如下:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4
 5 int main()
 6 {
 7     int N;
 8     string name;
 9     int maxsize = -1;
10     string maxsizename;
11     cin >> N;
12     for (int i = 0; i < N; i++)
13     {
14         cin >> name;
15         if (name.size() > maxsize)
16         {
17             maxsize = name.size();
18             maxsizename = name;
19         }
20     }
21     cout << maxsizename;
22     return 0;
23 }

这里什么结果都输不出来,然后调试时发现到第15行的判断语句时name.size()比maxsize长依旧没有进入后面的语句。然后突然记起来。。看CMU的CSAPP时说到了unsigned int和int之间作比较的一些看起来很奇怪的结果。

这里maxsize被初始化为-1,作为带符号整数,它的二进制码应该为全1

当int类型和unsigned int类型做比较,会被强制转型为unsigned int类型,而上面代码中maxsize和name.size()比较正是unsigned类型的比较。

此时由于maxsize二进制为全1,是unsigned int类型中最大的数,所以无论如何都进不了后面的语句。

和size_type有关的还有size_t,他们之间的关系如下:

为了使自己的程序有很好的移植性,c++程序员应该尽量使用size_t和size_type而不是int, unsigned

1. size_t是全局定义的类型;size_type是STL类中定义的类型属性,用以保存任意string和vector类对象的长度

2. string::size_type 制类型一般就是unsigned int, 但是不同机器环境长度可能不同 win32 和win64上长度差别;size_type一般也是unsigned int
3. 使用的时候可以参考:
   string::size_type  a =123;
   vector<int>size_type b=234;
   size_t b=456;
4. size_t 使用的时候头文件需要 <cstddef> ;size_type 使用的时候需要<string>或者<vector>
5.  sizeof(string::size_type) 
     sizeof(vector<bool>::size_type) 
     sizeof(vector<char>::size_type)  
     sizeof(size_t) 
     上述长度均相等,长度为win32:4 win64:8
6. 二者联系:在用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t

(转载自http://www.cnblogs.com/kaituorensheng/p/3239446.html)

在写代码的过程中,遇到的返回size_t或size_type的还有sizeof,strlen

原文地址:https://www.cnblogs.com/jiongyy0570/p/10349713.html

时间: 2024-10-12 08:10:28

string.size()和size_type的相关文章

C++ &lt;string&gt; 里面的size_type

string::size_type string的 str.size() 返回值是一个unsigned,实际上返回的是size_type类型的值. string类和其他的大多数标准库类型都定义了几套配套类型.这些类型体现了标准库与机器无关的特性.string::size_type是一个无符号的类型,因此尽量使用 auto len= line.size(); PS: 如果n是负数的话..line.size() < n 结果几乎全部为true 因为负数n会被转化成一个比较大的无符号值

从string.size()和string.length()聊到长度的问题和一个关于数据结构定义的技巧

最近工作中要查看一下string的长度,然后忘了是哪个函数,所以去网上搜了一搜,决定把网上学的和其他的一些有关长度的东西在这里汇总一下, 然后就有了此帖. string 是从c语言的char数组的概念发展出来的.但是char指针变量仍然和string的变量不是一个东西,虽然他们都可能是跟字符串打交道. 看下面的例子: char a[4] = "ab"; char c[] = "ab"; string b = "ab"; ----->  b[

C语言 string::size_type类型

string::size_type类型 从逻辑上来讲,size()成员函数似乎应该返回整型数值,或如2.2节"建议"中所述的无符号整数.但事实上,size操作返回的是string::size_type类型的值.我们需要对这种类型做一些解释. string类类型和许多其他库类型都定义了一些伙伴类型(companion types).这些伙伴类型使得库类型的使用是机器无关的(machine-independent).size_type就是这些伙伴类型中的一种.它定义为与unsigned型(

C++ string::size_type 类型【转】

1 int main() 2 { 3 string str("Hello World!\n"); 4 cout << "The size of " << str << "is " << str.size() 5 << " characters, including the newline" << endl; 6 return 0; 7 } 从逻辑上来讲,s

String用法大全(转)

转自:http://blog.sina.com.cn/s/blog_9054a03601013d5d.html(虽然这个人也是转的...) 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要.我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?).我们尽可以把它看成是C++的基本数据类型. 首先,为了在我们的程

54&gt;&gt;c++ string

string类的定义.操作. #include<iostream> #include<string> using namespace std; int main() { // 4 declare string s1; //default string s2( s1 ); string s3( "hello" ); string s4( 9, 's' ); //read and write string s_1, s_2; cin>>s_1>&g

size_type 和 size_t 的区别

标准库string里面有个函数size,用来返回字符串中的字符个数,具体用法如下:string st("The expense of spirit\n");cout << "The size of "<<st<<"is"<<st.size() << "characters, including the newline"<<endl;那么size()这个函数

【C++入门一点点】string

/*记录一些C++的一些基本用法吧*/ ①输入输出: 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int main() 6 { 7 string cww; 8 cin>>cww; //cin>>_-输入 9 cout<<cww<<endl; //cout<<_<<endl-输出 10 return 0; 11 } 然而,对

C/C++中字符串String及字符操作方法

本文总结C/C++中字符串操作方法,还在学习中,不定期更新... 字符串的输入方法 1.单个单词可以直接用std::cin,因为:std::cin读取并忽略开头所有的空白字符(如空格,换行符,制表符),读取字符直至再次遇到空白字符,读取终止.所以cin只能读取单个单词.显然可以多次使用cin来获取多个单词: 2.多个单词使用函数std::getline(std::cin, s)请看下面代码: #include <iostream> #include <string> int mai