C++中string数组怎么求长度(元素个数)
在C语⾔中,或者说在我们平时使⽤的基本类型中,数组的长度都可以⽤ sizeof(arr)/sizeof(arr[0]) 来求得。因为sizeof运算符可以求出每个对象所占内存的字节数,并且在这些基本类型组成的数组中,每个元素所占内存空间都是相同的,因此我们可以使⽤ “数量 = 总价 / 单价”这种⽅式来计算。
⽽我们的string字符串数组是可变长度的,按理说使⽤ string 创建的数组每个元素所占空间都是不同的,那string类型的数组该如何来获取其长度呢。
vector<> 数组类型
⾸先我们要知道的vector类型,这是⼀种数组类型,它提供了 v.size() ⽅法可以获取数组长度。
vector<vector<int>> v{{1,2,3},{4,5,6,7,8},{9,10}};
cout << v.size()<< endl;// 3
cout << v[1].size()<< endl;// 5
string对象⾃⾝也提供了⼀种 s.size() 的⽅法,⽤于获取字符串的长度。⽽string型的数组是没有办法直
接获取其长度的。如下⽰例中,s 只能通过s[0].size()的⽅式获得其数组中s[0]字符串的长度。并不能直接获得数组有⼏个成员。
string s[]={"hello","world!"};
cout << s->size()<< endl;// 等价于s[0].size()
cout << s[0].size()<< endl;// 5
c语言如何创建字符串数组cout << s[1].size()<< endl;// 6
注意:以上的vector类型是⼀种容器适配器,其本⾝就是数组类型,因此类中提供了获取元素个数的⽅法。⽽string类型同int类
型,double类型⼀样是⼀种基本的类型,因此我们⽆法直接依赖类本⾝提供的⽅法操作数组。
因此在我们使⽤string数组时,我们可以使⽤ vector< string> 利⽤vector容器保存string对象来操作,或者也可以使⽤我们原本的数组定义⽅式 string s[] 。
使⽤sizeof运算符求数组长度
通过上⾯的⽰例我们知道,string数组对象⽆法直接通过类中的⽅法获得其数组的元素个数,⽽我们⼜想到了 “数量 = 总价 / 单价” 这种计算⽅法。
参考 这篇博客我们可知,string对象存储的内容⼤⼩与其所占的空间(栈空间)是没有关系的,换句话说在⼀个string的数组中每个string 字符串所占的空间相同,即单价唯⼀。如下列⽰例所⽰:
string s1[]={"1"};
string s2[]={"1","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"};
string s3[]={"1","2","3"};
cout <<sizeof(s1)<<" "<<sizeof(s1[0])<< endl;
cout <<sizeof(s2)<<" "<<sizeof(s2[0])<<" "<<sizeof(s2[1])<< endl;
cout <<sizeof(s3)<<" "<<sizeof(s3[0])<<" "<<sizeof(s3[1])<<" "<<sizeof(s3[2])<< endl;
// 输出
/
/ 28 28
// 56 28 28
// 84 28 28 28
我们可以看到,s1所占总空间为 28 字节,⽽它只有⼀个成员 “1”,所占空间即为整个数组的空间。
s2所占空间为 56 字节,⽽它有两个元素,每个元素都占 28 字节,整个数组所占空间为 28 * 2 。
s3所占空间为 84 字节,⽽它有三个元素,每个元素都占 28 字节,整个数组所占空间为 28 * 3 。
如此以来,我们便可以使⽤ sizeof(s) / sizeof(s[0]) 来计算string数组的长度了。
string s1[]={"1"};
string s2[]={"1","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"};
string s3[]={"1","2","3"};
cout <<"s1 size = "<<sizeof(s1)/sizeof(s1[0])<< endl;
cout <<"s2 size = "<<sizeof(s2)/sizeof(s2[0])<< endl;
cout <<"s3 size = "<<sizeof(s3)/sizeof(s3[0])<< endl;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论