首页 > 编程语言 >秒懂C++之string类(上)

秒懂C++之string类(上)

时间:2024-07-27 21:57:04浏览次数:10  
标签:const string iterator s1 C++ 迭代 cout

fe594ea5bf754ddbb223a54d8fb1e7bc.gif

目录

 

一.string类的常用接口说明

二.不太常用接口(了解接口)

三.string类的遍历访问

3.1 迭代器iterator

3.2 反向迭代器

四.string的其他功能

4.1 reserve(扩容)

4.2 resize

4.3 at

4.4 append

4.5 +=

4.6 insert


一.string类的常用接口说明

#include <string>
#include <iostream>
using namespace std;

int main()
{
	string s1;
	string s2("hello world");
	string s3(5, 'a');
	string s4 = s3;//拷贝构造
	string s5(s4);//拷贝构造

	cout << s1 << endl;
	cout << s2 << endl;//hello world
	cout << s3 << endl;//aaaaa
	cout << s4 << endl;//aaaaa
	cout << s5 << endl;//aaaaa

	return 0;
}

二.不太常用接口(了解接口)

给无符号整型(size_t)值-1就相当于是让npos为整型最大值。

从第一位开始读取,往后读5位。

 

默认第0位读起,读5位

 确实不太常用。。。

三.string类的遍历访问

	string s8("abcdef");
	for (size_t i = 0; i < s8.size(); i++)
	{
		cout << s8[i] << " ";
		cout << s8.operator[](i) << " ";
	}
	s8[0] = 'x';
	cout << s8 << endl;//xbcdef

想不到吧,string类也可以用类似数组的【】.可读可写~

不过这都归功于运算符重载

可不要小看这两个版本,下面那个被const成员函数所修饰只读不写~

3.1 迭代器iterator

不过说到遍历真正的主流还是得看迭代器——iterator

	string s1("abcdef");

	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		*it += 1;
		cout << *it << " ";
		++it;
	}
//b c d e f g

现阶段我们通常认为迭代器iterator像指针~

注意:下标+【】只适用于部分容器,底层物理要有一定的连续。 链式结构、树形、哈希结构等等只能用迭代器。

注意:下面的const_iterator可不要当作const iterator it,前者(const_iterator it)本质是保护迭代器的数据,使*it不能改变。而后者(const iterator it)本质是保护迭代器本身 it不能改变。

后面没啥用,本来遍历访问就得靠it本身遍历,加了个const直接废了。

3.2 反向迭代器

	void func(const string & s)
	{
		string::const_reverse_iterator it = s.rbegin();
		//auto it = s.rbegin();
		while (it != s.rend())
		{
			// *it = 'x';

			cout << *it << " ";
			++it;
		}
		cout << endl;

	}

	int main()
	{
		string s1("hello world");
		func(s1);//d l r o w  o l l e h
		return 0; 
	}

因为在func函数中的形参被const所修饰,这意味着*it无法被修改。最后达成逆置的效果~

如果觉得string::const_reverse_iterator这一段太长我们也可以用auto来代替。

四.string的其他功能

4.1 reserve(扩容)

int main()
{
	string s1("hello world");
	cout << s1.size() << endl;//11
	cout << s1.capacity() << endl;//15
	s1.reserve(50);
	cout << s1.size() << endl;//11
	cout << s1.capacity() << endl;//63
	s1.reserve(10);
	cout << s1.size() << endl;//11
	cout << s1.capacity() << endl;//63
	return 0;
}

在vs编译器中reserve的扩容是按1.5倍率慢慢扩容的,而就算我们用reserve提前扩容最后也只会比预估的还大。

(提升:开似开辟了15个空间其实是16个,还有一个预留给‘/0’)

并且在vs编译器中reserve并不能缩容,也无法改变数据。所以基本用于在提前知道所需空间提前扩容节省空间~

4.2 resize

resize不仅可以扩容还会影响到数据的变化~

int main()
{
	string s1("hello world");
	cout << s1.size() << endl;//11
	cout << s1.capacity() << endl;//15
	s1.resize(13);//hello world
	cout << s1.size() << endl;//13
	cout << s1.capacity() << endl;//15
	s1.resize(14,'x');
	cout << s1 << endl;//hello worldx

	s1.resize(1);
	cout << s1.size() << endl;//1
	cout << s1.capacity() << endl;//15
	cout << s1 << endl;//h

	return 0;
}

没有追加字符时会默认在数据后加‘/0’。

当我们尝试缩容的时候发现在vs编译器下还是无法成功,但数据反而被缩小到相应个数了。

resize的作用也就相当于可以开辟空间的时候随便初始化。

4.3 at

int main()
{
	string s1("hello world");
	cout << s1[50] << endl;//直接报错
	cout << s1.at(50) << endl;//抛异常


	return 0;
}

at其实和【】用法基本一样,唯一不同的是它们对越界访问的处理不一样,【】直接报错,而at是抛异常

4.4 append

可以理解为尾插~

int main()
{
	string s1("hello world");
	string s2("aaaaaaa");

	s1.append("bbbb");
	cout << s1 << endl;//hello worldbbbb
	s1.append(3,'c');
	cout << s1 << endl;//hello worldbbbbccc

	s2.append(s1.begin(), s1.end());
	cout << s2 << endl;//aaaaaaahello worldbbbbccc




	return 0;
}

这是一些基本用法,但我们一般不用append,还有一个更简单的~

4.5 +=

int main()
{
	string s1("hello world");
	string s2("aaaaaaa");

	s1 += 'a';
	cout << s1 << endl;//hello worlda
	s1 += s2;
	cout << s1 << endl;//hello worldaaaaaaaa
	s1 += "ddd";
	cout << s1 << endl;//hello worldaaaaaaaaddd

	return 0;
}

+=的用法比append还简单~

4.6 insert

常见用法: 

int main()
{
	string s1("hello world");
	string s2("aaaaaaa");

	s1.insert(0, 1, 'b');//在0位置插入1个字符‘a'
	cout << s1 << endl;
	s1.insert(2, "aaaaa");// bhaaaaaello world
	cout << s1 << endl;

	return 0;

}

 

标签:const,string,iterator,s1,C++,迭代,cout
From: https://blog.csdn.net/fax_player/article/details/140623446

相关文章

  • 【C++】unsigned char与short的区别?
    unsignedchar与short的区别unsignedchar和short(通常为signedshort或简称为short)是C/C++中两种不同的整数数据类型。它们的主要区别在于存储大小、表示范围和是否带符号。存储大小:unsignedchar 通常占用1字节(8位)的存储空间。short 的大小依平台而定,但通常是2字节......
  • 最长的Hello, World!(C++)
    最长的Hello,World!(C++)#include<iostream>#include<string>#include<vector>#include<memory>#include<random>_<typenameT>classNode{public:Tdata;std::shared_ptr<Node<T>>next;Node(......
  • 【C++第九章】初阶模板
    C++模板初阶模板介绍......
  • C++第七次课笔记——引用
    引用作用:给变量取别名语法:数据类型&别名=原名intmain(){ //引用基本语法 inta=10; int&b=a; // cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; b=100; cout<<"a="<<......
  • C++第十一次课笔记——初始化列表算法、对象成员、静态成员
    一、初始化列表作用:C++提供初始化列表语法,用来初始化属性语法:构造函数():属性1(值1),属性2(值2),…{}classPerson{public: //传统的初始化操作 Person(inta,intb,intc){ m_A=a; m_B=b; m_C=c; } //初始化列表初始化属性 Person(inta,intb,int......
  • C++ 虚拟加载程序
    哦!J B K!我来啦!!!目录代码效果总代码  新知识生化危机  结尾代码上代码!(上次是这样吗?)voidHideCursor()//影藏光标{ CONSOLE_CURSOR_INFOcursor_info={1,0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);}还有!!! —————......
  • c++11 新特性 超级详细
    目录C++auto类型推导完全攻略auto类型推导的语法和规则auto的限制auto的应用使用auto定义迭代器auto用于泛型编程C++decltype类型推导完全攻略decltype推导规则decltype的实际应用汇总auto和decltype的区别语法格式的区别对cv限定符的处理对引用的处......
  • C++输入输出流
    目录入门     C++cout.put():输出单个字符C++cout.write():输出字符串C++cout.tellp()和cout.seekp()方法详解 C++tellp()成员方法C++seekp()成员方法 C++cout格式化输出(超级详细)C++cout成员方法格式化输出使用流操纵算子格式化输出C++怎样对输入输出......
  • C++ 红黑树
    1. 红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质......
  • c++ typedef 关键字详解
    在C++中,typedef关键字用于为已有的数据类型创建一个新的别名。这使得代码更加易读和维护,尤其是当使用复杂的类型定义时。typedef可以用来简化代码或使其更具描述性。基本语法typedefexisting_typenew_name;这里,existing_type是已有的类型,new_name是你为它创建......