STL string容器笔记

版权声明:内容若有错误,请您务必指出,感谢让我提高并给予我建议的你! 转载请注明出处 https://blog.csdn.net/qq792358814/article/details/81253070

2.1 容器string简介

  1. new a[60]动态数组,关于内存的操作,申请新的内存,使得数组不会超内存。而string不用考虑内存空间,提高开发效率。
  2. 容器是用来存储的,算法是对数据的一些操作,迭代器是容器和算法的一些关联
  3. 推荐一本书——侯捷老师《STL源码剖析》,要先会用再研究源码

 

2.2 string构造函数

  1. empty()函数,判断类是否为空,空返回true,非空返回false;
  2. string str;空字符串
  3. string str(size_type length,char ch);定义一个一定长度的字符串,eg:string str(5 , ‘a’);输出aaaaa
  4. string str1(“abcde”);输出abcde
  5. string str(“abcde”,2);输出ab
  6. string str(str1, 2 , 4);输出cde
  7. string str(str1); ;输出abcde

 

2.3 string基础属性

  1. string的容量,面试通常问及这一类的问题,而不会问函数的用法。容量指的是string、vector等等容器的对象能够包含多少个字符,不同的容器容量不一样。
  2. capacity()是用来测string的容量,初始化是15,若超过15个字符串,自动增加16个容量至31,以此类推。PS:vc++6.0是申请31个空间,每次增加32个空间,vs申请15个。
  3. reserve()是用来增加string得容量,不能变小,只能变大。
  4. length()测字符串长度,size()测字符个数,resize()重新改变字符个数,容量不变,除非超过了原来容量。

 

2.4 string输出属性

  1. c_str,是类里面char* p指向类的一个指针,输出的值与str一样
  2. str可以像数组一样使用下标,str[0] str[1],at()与下标一样用法.at(0) at(1),两个都不能越界。
  3.     try

    {

         str2.at(8);

    }

    catch (...)

    {

         cout << "yuejie" << endl;

    }

是一种尝试操作,尝试是否越界,但是不能用于str[]下标,下标是崩溃,at是异常。

 

2.5 string修改属性

2.6 string比较、复制函数

  1. 若vs有个报错的提示,警告为C4996,可以用预处理将警报消除,#pragma wanrning(dissable:4996)

2.7 string的迭代器

  1. String的迭代器是iterator,写法string::iterator,其他容器如vector写法一致。
  2. Begin函数,返回一个迭代器,指向第一个元素,end函数相反

用法: str.append(str1.begin(), str1.begin() +2);     

        str.erase(str.begin()+2, str.begin() + 5);

2.8 string的迭代器

  1. 算法前记得添加头文件#include <algorithm>
  2. For_each遍历函数,写法为:for_each(str.begin(), str.end(), fun);其中void fun(char c),函数里的值需要为char类型的。
  3. Sort排序函数,自动给string字符串排序,写法为:sort(str.begin(), str.end());估计是按照ASCII码大小排序,从小到大排序。
  4. 若sotr从大到小排序,需要加入greater函数,写法为:sort(str.begin(), str.end(),greater<char>());因为string出来的是字符串,所以用char类型。

PS:使用greater,需要加入头文件:#include <functional>

 

笔记代码如下所示:

#include <iostream>
#include <string>
#include <algorithm>//算法头文件,for_each
#include <functional>//greater头文件
//#define _SCL_SECURE_NO_WARNINGS
using namespace std;

void strdefine();//定义								2.2
void strproperty();//属性							2.3
void stroutput();//输出								2.4 
void strchange();//修改								2.5
void strfunction();//操作函数,比较与复制			                        2.6
void Funiterator();//迭代器							2.7
void testiterator();//测试迭代器					                2.7
void Func_suanfa();//算法							2.8
int main()
{
	//strdefine();
	//cout << "-----------------------------" << endl;
	//strproperty();
	//cout << "-----------------------------" << endl;
	//strchange();
	//cout << "-----------------------------" << endl;
	//strfunction();
	//cout << "-----------------------------" << endl;
	//Funiterator();
	//cout << "-----------------------------" << endl;
	//testiterator();
	//cout << "-----------------------------" << endl;
	Func_suanfa();

	system("pause");
	return 0;
}

void strdefine()
{
	cout << "以下是string的定义" << endl;
	string str;
	cout << str << "\t" << str.empty() << endl;

	string str1(5, 'a');
	cout << str1 << "\t" << str1.empty() << endl;

	string str2("abc de");
	cout << str2 << "字符串个数" << str2.size() << "字符串长度" << str2.length() << endl;

	string str3("abcde", 2);
	cout << str3 << endl;

	string str4(str2, 2, 4);
	cout << str4 << endl;
}
void strproperty()//属性
{
	cout << "以下是string的属性" << endl;
	string str;
	cout << "str的容量" << str.capacity() << "str的长度" << str.length() << endl;

	string str1(15, 'a');
	cout << "str1的容量" << str1.capacity() << endl;
	str1.reserve(31);
	cout << "str1变化后的容量" << str1.capacity() << endl;
	str1.resize(10);
	cout << str1.length() << endl;
	cout << str1.size() << endl;
	cout << str1.capacity() << endl;

	string str2("abcdefg");
	cout << "str2的容量" << str2.capacity() << " str2的长度" << str2.length() << endl;
	str2.resize(3);
	cout << str2 << endl;

	string str3("abcde", 2);

	string str4(str2, 2, 4);
}
void stroutput()
{
	string str2("abcdefg");
	cout << str2 << endl;
	cout << str2.c_str() << endl;
	cout << str2[0] << str2[1] << endl;
	cout << str2.at(0) << str2.at(1) << endl;
	try
	{
		str2.at(8);
	}
	catch (...)
	{
		cout << "yuejie" << endl;
	}
}
void strchange()//修改与插入
{
	string str2("abcdefg");
	//更改
	str2[2] = 's';
	cout << " 1 " <<str2 << endl;
	str2.at(2) = 'a';
	cout << " 2 " << str2 << endl;

	string str0(5 , '0');
	//插入
	str2.insert(2,str0); //将str0在str2的第二位插入 
	cout << " 3 " << str2 << endl;

	str2.insert(2, "wwwwww");
	cout << " 4 " << str2 << endl;

	str2.insert(2, str0, 0, 2);//从str0的第零位数,两个数,插入
	cout << " 5 " << str2 << endl;

	str2.insert(2,3,'1');//插入3个1
	cout << " 6 " << str2 << endl;
	//若不用尾部插入的函数,可以将插入位置设置为str2.length(),即是尾部位置
	cout << "-----------------------------" << endl;
	//尾部插入
	string str11("abcdefg");
	string str22(5,'w');
	str11 += str22;
	cout << " 1 " << str11 << endl;
	str11 += "00000";
	cout << " 2 " << str11 << endl;
	//插入函数
	str11.append("ooo");
	cout << " 3 " << str11 << endl;
	str11.append("+++", 2);
	cout << " 4 " << str11 << endl;
	//重载预算符
	str11 = '0';
	cout << " 5 " << str11 << endl;
	str11 = str22;
	cout << " 6 " << str11 << endl;
	//cin >> str11;
	//cout << " 7 " << str11 << endl;
	str11.assign("asdfghjk");//用法与定义一样
	cout << " 8 " << str11 << endl;
	//删除
	str11.erase(2,2);//从2位置删除两个
	cout << " 9 " << str11 << endl;
	str11.erase();//delete all
	cout << " 10 " << str11 << endl;

}
void strfunction() // 操作函数,比较与复制
{
	string str1("aabref");
	string str2("abr");
	//比较
	cout << (str1 < str2) << endl; //结果是真和假,1和0

	cout << str1.compare(str2) << endl;//compare是大于的,1和-1
	cout << str1.compare("asdc") << endl;

	cout << str1.compare(0, 1,"asde", 0, 1) << endl; //前面的是str1 0到1位,后面的是“asde”的
	//复制,不是直接复制字符串的值
	char arrstr[6] = { 0 };
	str1.copy(arrstr , 1 ,1);
	cout << arrstr << endl; 
	//查找子串
	cout << str1.find(str2, 1) << endl; //从str1里面寻找str2,若str1包含str2,则返回1,不然返回乱码
										//后面的参数指的是,从str1的第几位开始查找
	cout << (int)str1.find(str2, 2) << endl; //返回-1,乱码是-1的补码
	cout << (int)str1.find("ab", 0) << endl;

	//返回子串
	str1.substr(2, 4);
	cout << "00000"<<str1 << endl;
	str1.swap(str2);//交换
	cout << str1 << endl;

	cout << (str1 + str2) << endl;
	cout << (str1 + "haha") << endl;
}
void Funiterator()//迭代器
{
	string str("abcdefg");
	string::iterator ite;//string迭代器变量名,ite相当于char*字符指针,指向单个元素地址
	
	//char* a = (char*)str.c_str();
	//cout << a << endl;
	ite = str.begin();//begin返回字符串首地址
	str[2] = 'w';
	for(int i = 0;i < str.size();i++)//第一行
	{
		//cout << *ite << " ";
		//ite++;//第一种方法
		cout << ite[i] << " ";//第二种方法
	}
	cout << endl;
	for (ite; ite != str.end(); ite++)//第二行
	{
		*ite = 'a';
		cout << *ite << " ";
	}
	cout << endl;
	cout << str << endl;

	//str.reserve(30);//改容量,ite崩溃,迭代器失效,需要重新指向
	//cout << *ite << endl;


	str.append(5,'a');//增加字符,使得超过原本容量,ite崩溃 
	cout << *ite << endl;
}
void testiterator()//测试迭代器
{
	string str("abcefghij");

	string str1("efg");

	str.append(str1.begin(), str1.begin() +2);
	cout << str << endl; 
	str.erase(str.begin()+2, str.begin() + 5);
	cout << str << endl;

	str.insert(str.begin() + 2, 3, '0');
	cout << str << endl;

	str.insert(str.begin(), str1.begin(),str1.end());
	cout << str << endl;

}
void fun(char c)
{
	//c = '0';
	cout << c;
}
void Func_suanfa()//遍历算法 排序算法
{
	string str("gjajf1Ajl2kka4f");
	cout << "原字符串          :";
	for_each(str.begin(), str.end(), fun);//遍历函数
	//cout << endl;
	sort(str.begin(), str.end());//排序函数,自动给字符串排序,估计是按照ACII码大小来排序
	cout << endl;
	cout << "从小到大排序字符串:";
	for_each(str.begin(), str.end(), fun);
	cout << endl;
	sort(str.begin(), str.end(), greater<char>());
	cout << "从大到小字排序符串:";
	for_each(str.begin(), str.end(), fun);
	cout << endl;
}

猜你喜欢

转载自blog.csdn.net/qq792358814/article/details/81253070
今日推荐