-
讨论字符串的这几个函数
首先,length()、size()是STL string中的public成员函数;
strlen 是头文件 <cstring> 中的函数;
而sizeof(),并不是一个函数,而是一个运算符。
函数原型:
size_type size() const size_type length() const;// 这两个函数起着相同的作用,返回string所包含的内容多少。 size_t strlen(const char* str);
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
char m[100] = "hello world";
cout << "strlen()输出" << strlen(m) << endl;
cout << "sizeof()输出" << sizeof(m)/sizeof(char) << endl;
string s = m;
cout << "size()输出" << s.size() << endl;
cout << "length()输出" << s.length() << endl;
return 0;
}
strlen()输出 11
sizeof()输出 100
size()输出 11
length()输出 11
在上面的代码,我们可以看出,strlen(),length(),size(),可以输出相同的内容,但是sizeof()输出的是100,即刚开始我们初始化m的时候,所申请的长度。这即是一个区别
不同点一:用法不一样,strlen()需要接受参数,length(),size()是面向对象的用法。 sizeof()是运算符。
不同点二:功能不一样,strlen(),length(),size()返回的是字符串的长度,sizeof()返回的是所占用的内存。
-
sizeof() 运算符
sizeof()运算符用来求对象所占内存空间的大小。
获取基本类型的大小 1、基本类型 sizeof(char) = 1;2、常数 sizeof(1) = 4;
获取复杂数据的大小 1、结构体 2、数组 3、对象,,因此在查看内存对齐的时候,可以利用sizeof
struct {
char a;
int m;
}stu;
class A{
private:
int _m;
int _n;
public:
void fun() {
cout << "how are you" << endl;
}
};
int main()
{
char m[100] = "hh";
A a;
cout << sizeof(m)/sizeof(char) << endl; //输出100
cout << sizeof(char) << endl; //输出1
cout << sizeof(1) << endl; //输出4,即int类型
cout << sizeof(stu) << endl;//输出8,牵扯到内存对齐的内容
cout << sizeof(a) << endl; //输出8,牵扯到内存对齐和对象的存储,对象的内存只与成员变量有关,与成员函数无关
cout << sizeof(A) << endl;//输出8
return 0;
}
-
size() 和 capacity()
size() 在STL 中,可以返回容器里含有的值的数量;capacity()是 部分容器的函数,例如vector等。set,map等没有capacity这个函数
vector 容器的容量(用 capacity 表示),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数;
而 vector 容器的大小(用 size 表示),指的是它实际所包含的元素个数。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
std::vector<int>value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
value.reserve(20);
cout << "value 容量是:" << value.capacity() << endl;
cout << "value 大小是:" << value.size() << endl;
return 0;
}
//输出
value的容量是 20
value的大小是 15
结合该程序的输出结果,下图可以更好的说明 vector 容器容量和大小之间的关系。