当前位置 : 主页 > 编程语言 > c语言 >

string类(一)

来源:互联网 收集:自由互联 发布时间:2023-08-28
string类对象的常见构造 string类实现了多个构造函数的重载,常用的构造函数如下: (constructor)函数名称 功能说明 string()构造空的string类对象,即空字符串 string(const char s) *用 C-string 来构

string类对象的常见构造

string类实现了多个构造函数的重载,常用的构造函数如下:

(constructor)函数名称 功能说明 string() 构造空的string类对象,即空字符串 string(const char s)* 用 C-string 来构造 string 类对象 string(const char* s, size_t n) 复制s所指字符序列中的前n个字符 string(const string& s) 拷贝构造函数 string(size_t n, char c) 生成n个c字符的 string 类对象 string(const string& str, size_t pos, size_t len = npos) 复制str中从字符位置pos开始并跨越len个字符的部分

最后一个如果不给len,缺省值是npos,在定义中虽然npos = -1,但是npos是无符号数,所以是整数的最大值。

示例:

#include <string>
#include <iostream>
using namespace std;
int main()
{
	string s1;
	string s2("hello world");
	string s3("hello world", 5);
	string s4(s2);//拷贝构造s2
	string s5(5, 'c');//生成5个c字符的string类对象
	string s6(s2, 6, 5);//从下标为6的位置开始向后复制5个字符
	//在string类中流插入和流提取已经重载过了,可以直接使用
	cout << s1 << endl; //空串
	cout << s2 << endl; //hello world
	cout << s3 << endl; //hello
	cout << s4 << endl; //hello world
	cout << s5 << endl; //ccccc
	cout << s6 << endl; //world
	return 0;
}

我们还可以这样:

string s = "hello world"

因为会发生隐式类型转换,单参数的构造函数支持隐式类型转换,const char *转换成string,编译器优化为直接构造,如果不想进行隐式类型转换我们可以在构造函数前加关键字explicit

string类对象容量操作

函数名称 功能说明 size 返回字符串有效字符长度 length 返回字符串有效字符长度 capacity 返回空间总大小 empty 检测字符串是否为空串,是返回true,否则返回false clear 清空有效字符 reserve 为字符串预留空间 resize 将有效字符的个数改成n个,多出的空间用字符c填充 max_size 获取string对象的最大长度 shrink_to_fit(C++11) 缩容,将capacity缩小至和size一样大小

size/length函数

  • 使用size函数或者length函数获取当前有效字符的个数
size_t size() const;
size_t length() const;

示例:

#include <string>
#include <iostream>
using namespace std;
int main()
{
	string s("hello world"); 
	cout << s.size() << endl; // 11
	cout << s.length() << endl; // 11
}

size函数和length函数作用相同,因为string类产生的比较早,后来为了和其他的数据结构保持一致,所以增加了size函数。

max_size函数

  • 使用max_size函数获取string对象的最大长度
size_t max_size() const;

示例:

#include <string>
#include <iostream>
using namespace std;
int main()
{
    string s("hello world"); 
    cout << s.max_size() << endl; // 2147483647
}

capacity函数

  • 使用capacity函数获取当前对象所分配的存储空间的大小
size_t capacity() const;

示例:

#include <string>
#include <iostream>
using namespace std;
int main()
{
    string s("hello world"); 
    cout << s.capacity() << endl; // 15
}

VS下面的容量空间是不包含\0的。

empty函数

  • 使用empty函数判断字符串是否为空
bool empty() const;

示例:

#include <string>
#include <iostream>
using namespace std;
int main()
{
    string s("hello world"); 
    cout << s.empty() << endl; // true
}

clear函数

  • 使用clear函数清空有效字符,删除后对象变为空字符串
void clear();

示例:

#include <string>
#include <iostream>
using namespace std;
int main()
{
    string s("hello world"); 
    cout << s.size() << endl; // 11
    cout << s.capacity() << endl;//15
    s.clear();
    cout << s.size() << endl; // 0 
    cout << s.capacity() << endl; //15
}

resize函数

  • 使用resize改变当前对象的有效字符的个数
void resize (size_t n);
void resize (size_t n, char c);

resize规则:扩容并且初始化

1.当n大于对象当前的size时,将size扩大到n,扩大的字符为c,若c未给出,则默认为’\0’。 2.当n小于对象当前的size时,将size缩小到n。

示例:

#include <string>
#include <iostream>
using namespace std;
int main()
{
	string s("hello world");
	cout << s.size() << endl; // 11
	cout << s.capacity() << endl; //15
	cout << s << endl; //hello world
    
	//n小于对象当前的size时,将size缩小到n
	s.resize(5);
	cout << s.size() << endl;//5
	cout << s.capacity() << endl;//15
	cout << s << endl; //hello
    
	//n大于对象当前的size时,将size扩大到n,扩大的字符为c
	s.resize(12, 'x');
	cout << s.size() << endl;//12
	cout << s.capacity() << endl;//15
	cout << s << endl;//helloxxxxxxx
    
	//当n大于对象当前的size时,将size扩大到n,扩大的字符为c,若c未给出,则默认为’\0’
	s.resize(20);
	cout << s.size() << endl;//20
	cout << s.capacity() << endl;//31
	cout << s << endl;//helloxxxxxxx
}

注意:若给出的n大于对象当前的capacity,则capacity也会根据规则进行扩大。

reserve函数

  • 使用reserve改变当前对象的容量大小
void reserve (size_t n = 0);

reserve规则:  1、当n大于对象当前的capacity时,将capacity扩大到n或大于n。  2、当n小于对象当前的capacity时,capacity不变。

reserve函数对字符串的size没有影响,并且无法更改其内容。可以通过reserve函数提前开空间,减少扩容,提高效率。

示例:

#include <string>
#include <iostream>
using namespace std;
int main()
{
	string s("hello world");
	cout << s.size() << endl; // 11
	cout << s.capacity() << endl; //15

	//n小于对象当前的capacity时,capacity不变
	s.reserve(5);
	cout << s.size() << endl;//11
	cout << s.capacity() << endl;//15

	//n大于对象当前的capacity时,将capacity扩大到n或者大于n
	s.reserve(32);
	cout << s.size() << endl;//11
	cout << s.capacity() << endl;//47
}

shrink_to_fit函数

  • shrink_to_fit是缩容,将capacity缩小至和size一样(C++11)
void shrink_to_fit();

注意:

  • size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()
  • clear()只是将string中有效字符清空,不改变底层空间大小
  • resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时用'\0'来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变容量大小,如果是将元素个数减少,容量大小不变
  • reserve(size_t n = 0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的容量大小时,reserver不会改变容量大小。
【本文转自:美国服务器 http://www.558idc.com/mg.html欢迎留下您的宝贵建议】
上一篇:图的一些算法设计题
下一篇:没有了
网友评论