STL学习笔记(一)string

一个很草的笔记,函数太多了学一遍根本记不住,放上来方便复习和随时查找,有空慢慢更。

STL学习笔记目录
一、string容器
1.string
2.string的迭代器(待更新)
二、vector容器(待更新).
三、list容器(待更新).
四、deque双端队列(待更新).
五、map(待更新).
六、set(待更新).

简单了解STL

STL包含以下六个部分:

容器、迭代器、算法

适配器、分配器、仿函数

1.容器

是系统帮我们封装好的数据结构(数组、链表、栈、队列、树、hash表)

每种容器都能装任意类型

主要是数据结构的操作

2.算法

系统帮我们写好的算法(排序、交换、替换等等)

一个算法可以适用多个容器

3.迭代器

可以理解为是链接容器和算法的连接器

一、string容器

专门的字符串操作的一个类
字符串CString 、QString

跟 char*的区别:

char* 是指向字符数组首地址的指针,string.h 中声明了很多字符串操作,例如strlen strcat strcmp strcpy

string则是一个类,这个类将以上这些内容封装到一起,使字符串操作更加灵活

使用string时不用考虑内存分配释放,不用担心越界崩溃

1.头文件 string
2.构造函数
(1)无参构造 string()

直接输出,empty() 判断字符串是否为空,空返回true(1),非空返回false(0)

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

int main()
{
    string str; //无参构造,没有输出
    cout << str << str.empty() << endl; //在string的封装中进行了运算符重载,可以直接输出对象 str1.empty()返回1

    return 0;
}
(2)string(size_type length , char ch)

参数1:字符数
参数2:传入字符

string str1(5,'a'); 
cout << str1 << endl; //aaaaa
(3)字符串初始化

string(const char* str)

string str2("abcdefg");
cout << str2 << endl; //输出abcdefg
(4)截取str的前n个

string(const shar* str , size_type length)

string str("abcdefg",3);
cout << str << endl; //abc
(5)截取str中间几个

string (string &str , size_type index , size_type length)

参数一:截取对象
参数二:开始下标
参数三:截取字符数

string str("abcdefg");

string str1(str,2,5);
cout << str1 << endl; //cdefg
(6)拷贝构造 string(const string &str)
string str("abcdefg");

//用一个对象给另一个对象初始化时,调用拷贝构造
string str1(str);
cout << str1 << endl; //abcdefg
3.属性
(1)容量:可以容纳的字符数量

空字符串(无参str)的容量:少于15个字符时,默认为15个

原因是假如有一个大小为5的字符数组,那添加第六个字符时,不会直接在末尾添加,而是需要重新申请大小为6的空间,将前五个字符复制过来,再加入第六个字符,这样代码的效率是非常低下的,所以系统设定空字符串的容量是15

string str;
cout << str.capacity() << endl; //15

不同编译器下容量不同,越界时,不同编译器下增加的容量也不同,例如:

vs2005:超过15个,每超1个增加16个,超过n个增加15+ n*16个。例如16个时,容量为31个,即字符数16,容量15+16=31,字符数32,容量31+16=47(15+16+16),字符数48,容量47+16=63(15+16+16+16)

vc6.0:至少申请31个空间,以后每次增加32个

QT:至少申请15个空间,以后每次增加1个

void strpro() //QT
{
    string str1(16,'a');
    cout << str1.capacity() << endl; //16
}

修改容量函数: reserve();

不能变小,只能变大

vs2005:小于等于15个,即str1.reserve(15); 容量依旧是15;大于15个,即str1.reserve(16); 容量31 ;str1.reserve(32); 容量47 。规律和capacity()一样

QT:待测试

void strpro() //vs2005
{
    string str1(5,'a');
    str1.reserve(16);
	cout << str1.capacity() << endl; //30
}
(2)求字符串长度 length()
void strpro()
{
    string str;
    cout << str.length() << endl; //0

    string str1(5,'a');
    str1.reserve(16);
    cout << str1.length() << endl; //5

    string str2("abcdefg");
    cout << str2.length() << endl; //7

    string str3("abcdefg",3);
    cout << str3.length() << endl; //3

    string str4(str2,2,3);
    cout << str4.length() << endl; //3

    string str5(str2);
    cout << str5.length() << endl; //7
}
(3)求字符个数 size()
void strpro()
{
    string str;
    cout << str.size() << endl; //0

    string str1(5,'a');
    str1.reserve(16);
    cout << str1.size() << endl; //5

    string str2("abcdefg");
    cout << str2.size() << endl; //7

    string str3("abcdefg",3);
    cout << str3.size() << endl; //3

    string str4(str2,2,3);
    cout << str4.size() << endl; //3

    string str5(str2);
    cout << str5.size() << endl; //7
}
(4)重新设置字符个数,容量不变 resize()
void strpro()
{
    string str2("abcdefg");
    str2.resize(3);
    cout << str2 << endl; //abc
    cout << str2.size() << endl; //3
    cout << str2.length() << endl; //3
    cout << str2.capacity() << endl; //15
}
4.string的输出
(1)输出全部: << 以及 c_str()
void strcout()
{
    string str2("abcdefg");
    
    cout << str2 << endl; //重载运算符
    
    //相当于在一个类中有一个char* p
    //当传入abcdefg时,系统会申请一块空间(p = new[15]),将abcdefg放入
    //p是字符串首地址,c_str的作用是 return p
    cout << str2.c_str() << endl;
}
(2)输出单个字符: []下标运算,at()
void strcout()
{
    string str2("abcdefg");
    cout << str2[0] << endl; //重载下标运算符,越界会崩溃
    cout << str2.at(0) << endl; //越界会出现异常 out_of_range

    //越界处理
    try
    {
        str2.at(8);
    }
    //catch(...)
    catch(out_of_range &a)
    {
        cout << "崩溃了" << endl;
    }
}
5.string的修改
(1)修改指定元素:at函数
string str("abcdefg");
str[2] = 's';
str.at(3) = 'q';
(2)中间插入 insert

index位置插入str
basic_string &insert(size_type index,const basic_string &str);

index位置插入一个字符串
basic_string &insert(size_type index,const char* str);

index1位置插入另一个对象的某一段
basic_string &insert(size_type index1,const basic_string &str,size_type index2,size_type num);

插入前几个
basic_string &insert(size_type index,const char* str,size_type num);

插入num个ch
basic_string &insert(size_type index,size_type num,char ch);

void strchange()
{
    string str("abc");
    string str1("xyz");

    str.insert(1,str1);

    cout << str << endl; //axyzbc
}
(3)末尾插入字符或字符串 append

+= 拼接:拼接对象、拼接字符串

尾巴通过一个对象拼接
basic_string &append(const basic_string &str);

尾巴通过一个字符串拼接
basic_string &append(const char *str);

拼接一个子对象的某一段
basic_string &append(const basic_string &str,size_type index,size_type len);

拼接字符串前几个
basic_string &append(const char* str,size_type num);

拼接num个字符ch
basic_string &append(size_type num,char ch);

void strchange()
{
    string str("abc");
    string str1("xyz");
    
    str.append(str1);

    cout << str << endl; //abcxyz
}
6.string复制比较:操作函数

(1)比较
a < b ,返回-1
a == b ,返回0
a > b ,返回1

比较两个对象
int compare(const basic_string &str);

void strcom()
{
    string str("abcdefg");
    string str1("abd");
    
    /*
      原理:遍历字符串
      a与a比较,b与b比较,相同继续往后比,
      c与d比较,c<d ,比较结束,abd > abcdefg,即str1 > str
      
      如果是abcdefg和abc,a与a比较,b与b比较,c与c比较
      c后面没有了,比较结束,abcdefg > abc,即str > str1
      
    */

    //重载比较运算符,结果是真 1 假 0 (bool类型)
    cout << (str > str1) << endl; //0

    //a < b 返回-1 ,a == b 返回0 ,a > b 返回1  (int类型)
    cout << str.compare(str1) << endl; //-1
}

比较一个对象和字符串
int compare(const char* str);

本对象的一段,跟参数3 的对象比较
int compare(size_type index,size_type length,const basic_string &str);

两个字符
int compare(size_type index,size_type length,const basic_string &str,size_type index2,size_type length2);

void strcom()
{
    string str("abcdefg");
    string str1("abd");

    //a < b 返回-1 ,a == b 返回0 ,a > b 返回1  (int类型)

    //bcd 与 abd 比较,b > a
    cout << str.compare(1,3,str1) << endl; //1

    //bcd 与 bd 比较,c < d
    cout << str.compare(1,3,str1,1,2) << endl; //-1
}

(2)复制

将对象中的某一段复制进一个字符数组中

size_type copy(char* str,size_type num,size_type index);

参数1:数组
参数2:复制的字符数量
参数3:开始复制的下标

void strcopy()
{
    string str("abcdefg");

    char a[6] = {0};

    str.copy(a,2,3); //注意不要越界

    cout << a << endl; //de
}

(3)查找子串

从指定位置开始查找str,找到就返回起始位置
size_type find (const basic_string& str, size_type index);

指定位置查找一个字符串
size_type find (const char* str, size_type index);

指定段查找str
size_type find (const char* str, size_type index,size_type length);

指定位置开始查找字符
size_type find (char sh, size_type index);

void strfun()
{
    string str("abcdefg");
    string str1("abr");
    string str3("bc");

    cout << str.find(str3,0) << endl; //找到返回下标
    cout << (int)str.find(str1,0) << endl; //没找到返回-1的补码,强转int即-1
    cout << (int)str.find("def",0) << endl;
    cout << (int)str.find('e',0) << endl;

}

(4)返回子串

返回指定位置的子串
substr(size_type index,size_type num = npos);

string str("abcdefg");
cout << str.substr(2,4) << endl; //cdef

(5)交换

交换两个对象的内容
swap(basic_string &str);

string str("abcdefg");
string str1("hello");

str.swap(str1);

cout << str << endl;
cout << str1 << endl;

7.运算符重载

string str("abcdefg");
string str1("hello");

//可以加对象,也可以加字符串
cout << str+str1 << endl;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值