C++初阶---STL入门+(string)

1)STL入门

①STL概念

概念 STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,并且是一个包括数据结构与算法的软件框架


②STL版本:

  1. 原始版本
    Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本–所有STL实现版本的始祖
  2. P. J. 版本
    由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异
  3. RW版本
    由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般
  4. SGI版本
    由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高

③STL六大组件

  1. 仿函数
    包括:grater less…
  2. 算法
    包括:find swap reverse…
  3. 迭代器
    包括:iterator const_iterator reverse_iterator…
  4. 空间配置器
    包括:allocator
  5. 容器(数据结构)
    包括:string vector list…
  6. 配接器
    包括:stack queue priority_queue

2)string

1. string入门:

  1. 字符串是表示字符序列的类
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)
    摘自cplusplus.com
    在这里插入图片描述
  5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作

2. 使用注意

1 不能操作多字节或者变长字符的序列
2. 在使用string类时,必须包含#include头文件以及using namespace std


3. string使用

①string构造函数

1.构造一个空字符串,长度为零个字符

string();

2.函数构造str的副本

string (const string& str);

3.构造函数 复制 str 从字符位置 pos 开始并跨越 len 个字符的部分(或直到 str 的结尾,如果 str 太短或 len是 string::npos)

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

4.复制s指向的空终止字符序列(C-string)

string (const char* s);

5.从s所指向的字符数组中复制前n个字符

string (const char* s, size_t n);

6.用字符c的n个连续副本填充字符串

string (size_t n, char c);

7.复制范围(first,last)中的字符序列,按相同的顺序

template <class InputIterator>
	string  (InputIterator first, InputIterator last);

8.初始化列表 以相同的顺序复制il中的每个字符
9.移动构造函数 获取str的内容 str 处于未指定但有效的状态


上面的所有构造函数都支持成员类型 allocator_type 的对象作为末尾的附加可选参数,这对于 string 是不相关的(上面未显示,请参阅 basic_string 的构造函数以获取完整签名)


示例

int main ()
{
 std::string s0 ("Initial string");

 // constructors used in the same order as described above:
 std::string s1;
 std::string s2 (s0);
 std::string s3 (s0, 8, 3);
 std::string s4 ("A character sequence");
 std::string s5 ("Another character sequence", 12);
 std::string s6a (10, 'x');
 std::string s6b (10, 43);      // 43 is the ASCII code for '+'
 std::string s7 (s0.begin(), s0.begin()+7);

 std::cout << "s1: " << s1 << "\ns2: " << s2 << "\ns3: " << s3;
 std::cout << "\ns4: " << s4 << "\ns5: " << s5 << "\ns6a: " << s6a;
 std::cout << "\ns6b: " << s6b << "\ns7: " << s7 << '\n';
 return 0;
}

输出
s1:
s2: Initial string
s3: str
s4: A character sequence
s5: Another char
s6a: xxxxxxxxxx
s6b: ++++++++++
s7: Initial


②string类对象的常见容量操作
size length capacity
名称功能
size返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
{
	string s("string");
	cout<<s.size()<<endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;

在这里插入图片描述
注意

  1. 有效字符串长度不包括’\0’
  2. length是因为C语言的习惯而保留下来的,string类最初只有length,引进STL后,为了兼容,又添加了size,便于符合STL的接口规则
    在使用时,size() 一般用作返回容器大小的方法,length() 一般用作返回一个序列的长度,但两者返回的结果是一样的

clear
名称功能
clear清空有效字符
	string s("string");
	cout<<s.size()<<endl;
	cout << s.capacity() << endl;
	s.clear();
	cout << s.size() << endl;
	cout << s.capacity() << endl;

在这里插入图片描述
注意

  1. 清空时只是将size清0,不改变底层空间的大小

resize
名称功能
resize将有效字符的个数该成n个,多出的空间用字符c填充
string s("string");
cout<<s.size()<<endl;
cout << s.capacity() << endl;
s.resize(20);
cout << s.size() << endl;
cout << s.capacity() << endl;
s.resize(4);
cout << s << endl;
cout << s.size() << endl;
cout << s.capacity() << endl;
s.resize(20,'a');//多余的用'a'填充
cout << s << endl;
cout << s.size() << endl;
cout << s.capacity() << endl;

在这里插入图片描述
注意

  1. resize多余的空间会用’\0’填充
    在这里插入图片描述
  2. 空间不够会自动扩容(所以当我们要开辟空间同时对空间初始化,可以用resize),且VS编译器下扩容是每次按1.5倍扩(g++是一次2倍),后面探讨

reserve
名称功能
reserve为字符串预留空间
string s;
cout<<s.size()<<endl;
cout << s.capacity() << endl;
s.reserve(200);
cout << s.size() << endl;
cout << s.capacity() << endl;
s.reserve(100);
cout << s.size() << endl;
cout << s.capacity() << endl;

在这里插入图片描述

string s;
size_t sz = s.capacity();
for (int i = 0; i < 100; ++i)
{
	s.push_back('c');
	if (sz != s.capacity())
	{
		sz = s.capacity();
		cout << "capacity: " << sz << '\n';
	}
}

在这里插入图片描述
操作
如果我们知道要开辟的空间大小应该一次开好,避免增容,提高效率
注意

  1. 底层会开辟一个临界capacity,未达到时重新缩小capacity会缩小,当达到了那个临界就不会了在这里插入图片描述在这里插入图片描述
  2. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小
  3. 不要轻易使用这个函数,string的扩容和缩容都是很占用CPU的操作,对效率有影响
  4. string.reserve(int nSize )中nSize需要保证要能足够容纳string中的字符,否则此方法无效(注意不会崩溃)
  5. 在VS下扩容会按1.5倍扩且string.reserve(int nSize )设置完毕后自动将string的占用空间对齐到整数步长.
    比如20会对齐到2*16-1 = 31
    (1????)
  6. 在g++下是2倍增容
    在这里插入图片描述
其他
名称功能
empty检测字符串释放为空串,是返回true,否则返回false
max_size返回字符串的最大大小
shrink_to_fit缩小到适合

具体参考cplusplus.com string


③string类对象的访问及遍历操作
名称功能
operator[]返回pos位置的字符,const string类对象调用
begin+endbegin获取一个字符的迭代器 end获取最后一个字符下一个位置的迭代器
rbegin+rendbegin获取一个字符的迭代器 end获取最后一个字符下一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式

以下为三种遍历方式(需要注意的以下三种方式除了遍历string对象,还可以遍历修改string中的字符)
注意 以下三种方式对于string而言,第一种使用最多

string s("hello Bit");
// 1. for+operator[]
for (size_t i = 0; i < s.size(); ++i)
	cout << s[i] << endl;
// 2.迭代器
string::iterator it = s.begin();
while (it != s.end())
{
	cout << *it << endl;
	++it;
}
string::reverse_iterator rit = s.rbegin();
while (rit != s.rend())
	cout << *rit << endl;
// 3.范围for
for (auto ch : s)
	cout << ch << endl;

iterator

const对象要用const迭代器,只读,不能写

string s("hello");
string::const_iterator it = s.cbegin();
while (it != s.cend())
{
	//*it += 1;
	cout << *it << " ";
	++it;
}
cout << endl;

rbegin 和 rend

string::const_iterator it = s.begin();
while (it != s.end())
{
	//*it += 1;
	cout << *it << " ";
	++it;
}
cout << endl;
//string::const_reverse_iterator rit = s.rbegin();
auto rit = s.rbegin();
while (rit != s.rend())
{
	//*rit += 1;
	cout << *rit << " ";
	++rit;
}
cout << endl;

注意这里cbegin和cend也可以直接用begin和end(const c可以直接省略)
(C++11里增加了以下接口来匹配)

在这里插入图片描述


④string类对象的修改操作
push_back append +=
名称功能
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+=在字符串后追加字符串str
insert少用
erase少用

在这里插入图片描述
注意insert 和erase 少用,因为数据在头部和中间时要挪动数据,效率底下


c_str
名称功能
c_str返回C格式字符串
string s;
/*char* c;
string s1 = "1234";
c = s.c_str();*///此处错误 
//c_str()返回的是一个分配给const char*的地址,
//其内容已设定为不可变更,如果再把此地址赋给一个可以变更内容的char*变量,就会产生冲突
char c[20];
string s1 = "1234";
strcpy(c, s.c_str());
cout << s1.c_str() << endl;

注意
c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同.


find rfind sub_str
名称功能
findnpos从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置(查找字符串中最后一次出现的内容)
sub_str在str中从pos位置开始,截取n个字符,然后将其返回

npos是string里面的一个静态成员变量static const size_t npos = -1;


示例(取出url中协议、域名、uri)

string url("https://blog.csdn.net/lplp90908/article/details/49998181/");
size_t i1 = url.find("://");
if (i1 != string::npos)
{
	string protocol = url.substr(0, i1 - 0);
	cout << "protocol:" << protocol << endl;
}
size_t i2 = url.find('/', i1 + 3);
if (i2 != string::npos)
{
	string domain = url.substr(i1 + 3, i2 - (i1 + 3));
	cout << "domain:" << domain << endl;
}
string uri = url.substr(i2);
cout << "uri:" << uri << endl;

在这里插入图片描述
注意

  1. 在string尾部追加字符时,s.push_back(c)/ s.append(1, c) / s += 'c’三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串

⑤string类非成员函数

getline
名称功能
getline获取一行字符串

getline场景:cin遇到空格就结束读取

string line;
// while(cin>>line)
while(getline(cin, line))
{
size_t pos = line.rfind(' ');
cout<<line.size()-pos-1<<endl;
}
其他
名称功能
operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>>+operator<<输入运算符重载
relational operators大小比较

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STL是指标准模板库(Standard Template Library),它是C++语言的一部分,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的目标是提供高效、可重用和可扩展的组件,以便开发人员能够更轻松地编写高质量的代码。STL包含了许多常见的数据结构,如vector、list、set、map等,以及各种算法,比如排序、查找、遍历等。通过使用STL开发人员可以更加高效地处理各种数据结构和算法的问题,提高代码的开发效率和质量。 在STL中,我们可以使用各种容器来存储和管理数据。例如,我们可以使用std::map来创建一个键值对的映射,其中每个键都有一个与之相关联的值。下面是一个示例代码,展示了如何创建和使用一个std::map对象: std::map<std::string, int> disMap() { std::map<std::string, int> tempMap{ {"C语言教程",10},{"STL教程",20} }; return tempMap; } std::map<std::string, int> newMap(disMap()); 在这个示例中,disMap()函数创建了一个临时的std::map对象,并初始化了其中的一些键值对。然后,使用移动构造函数将这个临时对象移动到了一个新的std::map对象newMap中。最终,我们可以通过newMap对象来访问和操作这些键值对。 综上所述,STLC++中的标准模板库,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的使用可以提高代码的开发效率和质量,并且通过各种容器和算法,可以方便地处理各种数据结构和算法的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ STL详解超全总结(快速入门STL)](https://blog.csdn.net/qq_50285142/article/details/114026148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【C++实验】阅读STL源码并分析](https://blog.csdn.net/qq_35760825/article/details/125311509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值