> 文章列表 > string类(上)

string类(上)

string类(上)

string类(上)

  • 1.标准库中的string类
  • 2.string类对象的常见构造
    • ①string()
    • ②string(const char* s)
    • ③string(size_t n,char c)
    • ④string(const string&s)
    • ⑤string(const string& str,size_t pos,size_t len=npos)
    • ⑥string(const char* s,size_t n)
  • 3.string类对象的容量操作
    • ①size
    • ②length
    • ③capacity
    • ④empty
    • ⑤clear
    • ⑥reserve
    • ⑦resize

🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【C++的学习】
📝📝本篇内容:标准库中的string;string类对象的常见构造;string类对象的容量操作
⬆⬆⬆⬆上一篇:C++模板初阶
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-

1.标准库中的string类

string是表示字符串的字符串类
string在底层实际是:basic_string模板类的别名,typedef basic_string<char,char_traits,allocator>string
在使用string类时,必须包含#include头文件以及using namespace std;

2.string类对象的常见构造

①string()

构造空的string类对象,即空字符串
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s;cout << s << endl;return 0;
}

②string(const char* s)

用c-string来构造string类对象
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");cout << s << endl;return 0;
}

③string(size_t n,char c)

string类对象中包含n个字符c
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s(10,'c');cout << s << endl;return 0;
}

④string(const string&s)

拷贝构造函数
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s(10,'c');string s1(s);string s2 = s;cout << s << endl;cout << s1 << endl;cout << s2<< endl;return 0;
}

⑤string(const string& str,size_t pos,size_t len=npos)

复制从字符位置pos开始并跨越len字符的str部分(如果str太短或len为string::npos,则复制到str结尾)
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");string s1(s,6,5);cout << s1<< endl;return 0;
}

string类(上)
上图是文档中查到的npos,他是一个无符号的unsigned int,值又是-1,所以说它就是无符号整形的最大值,因此,当你参数len作为缺省值或者大于str的长度时,他就是复制到str结尾
string类(上)
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");string s1(s,6);cout <<s1 << endl;return 0;
}

⑥string(const char* s,size_t n)

从由s指向的字符数组中复制前n个字符
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world",5);cout << s << endl;return 0;
}

3.string类对象的容量操作

①size

返回字符串有效字符长度
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");cout << s.size()<<endl;return 0;
}

②length

返回字符串有效字符长度
string类(上)
和size功能一样,由于历史原因,所以说会有length,但是推荐使用size

③capacity

返回空间总大小
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");cout << s.capacity()<<endl;return 0;
}

④empty

检测字符串是否为空串,是返回true,否则返回false
string类(上)
string类(上)

⑤clear

清空有效字符
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");s.clear();cout << s.size() << endl;cout << s.capacity() << endl;return 0;
}

可以看出clear只是清空有效字符,但不会缩容

⑥reserve

为字符串预留空间
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");s.reserve(100);cout << s.size() << endl;cout << s.capacity() << endl;return 0;
}

可以把空间提前开大,但是打印出来的capacity大小并不是所设置的,这是因为还存在编译器对齐等各种原因,但是无论怎么样,开出的空间肯定大于等于你所设置的参数

⑦resize

将有效字符的个数改成n个,多出的空间用字符c填充
string类(上)

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{string s("hello world");s.resize(20,'c');cout << s.size() << endl;cout << s.capacity() << endl;cout << s << endl;return 0;
}

注意:
1.size()和length()方法底层实现完全原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是使用size()
2.clear()只是将string中有效字符清空,不改变底层空间大小
3.resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize是用0来填充多出的元素空间,resize(size_t n,char c)是用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果将元素个数增多,可能会改变底层容量大小,如果是将元素个数减少,底层空间总大小不变
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。知道需要多少空间,提前开空间,减少扩容,提高效率

当resize没给第二个参数时:
string类(上)
当resize的参数小于字符串有效长度时:
string类(上)
可以看出resize的参数小于字符串有效字符时,会进行清除字符

🌸🌸string类(上)的知识大概就讲到这里啦,博主后续会继续更新更多C++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

91魔方网