STL: C++标准模板库的简称,它是C++的一部份。标准C++库的所有的标识符都是在一个名为std的命名空间中定义的

在使用STL中相关模板时,需要包含相关头文件,然后using namespace std;

注意:C++所用的头文件名是在C语言的相应的头文件名(但不包括后缀.h)之前加一字母c 

例如,C语言中有关输入与输出的头文件名为stdio.h在C++中相应的头文件名为cstdio

STL分为四大类:

字符串(string)  容器(Container)   迭代器(iterator)    算法(algorithm)

使用STL的好处:

数据结构和算法的分离,高可重用性,高性能,高移植性,跨平台。

不需要思考STL内部具体实现过程,只要能熟练使用STL,这样就可以把精力专注于程序开发的其它方面。

高可重用性:STL中几乎所有代码都采用了模板类和模板函数的方式实现

高性能:如使用红黑树的map可以高效的从十万条记录里查找出指定的纪录

高移植性:在项目A中使用STL编写的模快,可以直接移植到项目B中

跨平台: 如在windows平台下使用vs编写的代码可以直接在任意系统上直接编译

---------------------------------------------------------------------------------------------------------------------------------------------

string是STL的字符串类型,用于存储以及处理各种字符串相关操作

使用string需要包含头文件 #include <string>

string.h  是c语言头文件

cstring   是c++头文件,提供C语言中对字符串处理的有关函数(如strcmp,ctrcpy)的声明

string 是C++中对字符串处理的新功能

string与char*的区别:

string  是STL中一种封装好的字符串类型,由系统负责内存管理

char*  是指向字符数组的一个指针,需要手动进行内存管理,容易出现内存泄露

构造函数:

 //string构造
void StringStructure()
{
string str1; //默认构造一个空的字符串 //string(const char*)
string str2("abc"); //用char*构造str2 (str2="abc")
//string(const string&)
string str3(str2); //用另一个string对象构造str3 (str3=str2)
//string(int n,char c)
string str4(,'a'); //用5个'a'来构造str4 (str4="aaaaa")
//string(const char* s, int n)
string str5("Hello",); //用s的前n个字符来构造str5 (str5="Hel") string str6 = "Hello";//str6="Hello"
//string(string s,int nPos,int n)
string str7(str6,,);//用s的nPos位置开始的n个字符来构造str7(str7="llo") return;
}

string构造

获取长度:

 //string长度
void StringLeng()
{
string str = "abc";
int nLeng = str.length(); //nLeng = 3
int nSize = str.size(); //nSize = 3 //二者是相同的功能,都是返回字符串的长度
return;
}

string长度

判断是否为空:

 //string是否为空
void StringEmpty()
{
//二者都可以用来判断是否为空
//前者使用empty方法,后者使用重载的==号操作符
string str;
bool bEmpty = str.empty(); //true
bool bEmpty_1 = str == ""; //true str = "aaa";
bEmpty = str.empty(); //false
bEmpty_1 = str.empty(); //false return;
}

string是否为空

赋值操作:

 //string赋值
void StringAssign()
{
string str = "abc"; //使用常量字符串赋值
string str1 = str; //使用另一个string进行赋值
char szBuff[] = "abc";
string str2 = szBuff; //使用一个字符数组进行赋值
char* pStr = "";
string str3 = pStr; //使用一个字符串指针进行赋值
//使用assig()进行赋值
string str4;
str4.assign("abc"); //使用字符常量的指针赋值 (str4=abc)
str4.assign(str3); //使用另一个string进行赋值 (str4=123)
str4.assign("Hello",); //使用字符串的前三个字符进行赋值 (str4=Hel)
str4.assign(str3,,); //使用str3中下标为1开始的2个字符进行赋值 (str4=23)
str4.assign(,'a'); //使用5个字符a进行赋值 (str4=aaaaa) return;
}

string赋值

存取操作:

 //string存取
void StringAccess()
{
string strA("abcdef");
//使用数组下标方式存取string
char ch = strA[];//取字符串下标为3的元素赋值给ch, (ch = 'd')
strA[] = ''; //用字符修改字符串下标为0的元素,strA="1bcdef"
//注意:使用数组[]方式访问,超出范围会产生断言错误
char chError = strA[]; //error:out of range //使用.at存取string
char ch1 = strA.at(); //ch1= 'd'
strA.at() = ''; //strA="1bcdef"
//注意:使用at()方式访问,超过范围会抛出异常
char chError1 = strA.at(); return;
}

string存取

连接操作:

 //string的连接
void StringAppend()
{
//使用+=连接
string str = "Hello";
str += " word"; //与const char*连接 (str="Hello word")
string str1 = " !";
str += str1; //与string连接(str="Hello word !") //使用append往字符串后面追加数据
string strA = "Hello,";
strA.append(" word");//append一个const char* //(str="Hello, word")
string strB = "!";
strA.append(strB); //append一个string (str="Hello, word!") string strC = "Hello, ";
string strD = "Hello, word ";
strC.append(strD,,);//以strD的pos位置为7开始的5个字符追加到strC中(strC="Hello, word ")
strC.append(,'!'); //append三个字符! (strC=Hello, word !!!) return;
}

string的连接

比较操作:

 //string的比较
void StringCompare()
{
//使用compare比较二个字符串的大小
//1.逐一取出二个字符串相应位置的字符进行比较,如果不相等就返回比较结果,
//相等的话就取下一个字符接着比较
//2.比较规则,根据字符的ascii码值进行比较,小写字母比大写字母的ascii码大
//3.第一个字符串大于第二个字符串,返回1。小于返回-1, 二者相同返回0 string strA = "abcd";
string strB = "abcd";
string strC = "Abcd";
string strD = "aacd"; int nAB = strA.compare(strB); //strA和strB相同返回0 (nAB = 0)
int nBC = strB.compare(strC); //strB的第一个字符'a'比strC的第一个字符'A'大,返回结果1 (nBC=1)
int nDA = strD.compare(strA); //strD与strA第一个字符都为'a',判断下一个字符.strD的字符'a'小于strA的字符'b',
//结果为-1 (nDA=-1) //使用重载运算符== < > 比较
bool bAB = strA == strB; //二者相同,返回真
bool bBC = strB > strC; //B大于C,也是返回真
bool bDA = strD < strA; //D小于A,也是返回真 //compare返回的是整数,重载运算符返回的是布尔值,相比而言后者结果更加直观 return;
}

string的比较

提取子串:

 //string的子串
void StringSubStr()
{
//使用substr
string str("Hello");
string strA = str.substr(); //取得str中pos位置为2开始的所有字符串,返回string (strA="llo")
string strB = str.substr(,); //取得str中pos位置为2开始的后面3个字符,返回string (strA="llo") return ; }

string的子串

查找操作:

 //string的查找
void StringFind()
{
//使用find(正向查找,从字符串第一个字符开始向后查找第一次出现的位置)返回pos
string str = "Hello";
int nPos = str.find('l'); //查找字符'l'在字符串中第一次出现位置 (nPos = 2)
int nPosA = str.find("lo");//查找字符串"lo"在字符串中的位置 (nPos = 3) //使用rfind(反向查找,从字符串最后一个字符开始向前查找)返回pos
int nPosB = str.rfind('l'); //字符串中有二个l,rfind是从后往前找,//所以找到的是
//最后一个l在字符串上的位置.(nPosB = 3)
int nPosC = str.rfind("lo");//查找字符串"lo"在字符串中的位置 (nPos = 3) //注意:不论是find还是rfind,返回pos都是被查询字符或字符串在源字符串中从左到右数的下标
return;
}

string的查找

插入操作:

 //string的插入
void StringInsert()
{
//使用insert(在指定pos前面插入字符或字符串)
string str = "abc";
str.insert(,,''); //在pos为1的字符'b'前面插入五个字符'1' (str = "a11111bc")
str.insert(,""); //在pos为0的字符'a'前面插入字符串"66" (str = "66a11111bc") return;
}

string的插入

删除操作:

 //string的删除
void StringErase()
{
//使用erase(删除指定pos位置开始后面的字符或字符串)
string str = "abcdf110";
str.erase(); //删除pos为5开始的后面所有字符 (str = abcdf)
string strA = "abcdf110";
strA.erase(,); //删除pos为5开始的后面2个字符 (str = abcdf0) return;
}

string的删除

替换操作:

 //string的替换
void StringReplace()
{
//使用replace(用另一个字符串替换pos位置开始的指定长度的字符串)
//1.先删除pos位置开始的指定长度的字符串
//2.把用于替换的字符串插入到(pos位置+1到pos+替换的字符数之间)的位置,组合成新的字符串
string str = "abca";
str.replace(,,""); //删除pos为1开始的2个字符"bc",剩余"aa",然后在
//第一个'a'与最后一个'a'之间插入替换的字符串"6666". (str = "a6666a")
return;
}

string的替换

交换操作:

 //string的交换
void StringSwap()
{
//使用swap(把二个字符串中的数据进行相互交换)
string strA = "abc";
string strB = "";
strA.swap(strB); //(strA = "123") (strB = "abc") return ;
}

string的交换

string与char*

 //string与char*
void StringToCharArray()
{
string str("abc");
//通过c_str()方法返回一个const char*
const char* pCh = str.c_str();
cout<<pCh<<endl;
cout<<str.c_str()<<endl; //通过copy拷贝字符串到char*所指向的字符数组空间
//int copy(char* dest,int count, int pos=0) 返回值是实际拷贝的数目,pos默认为0
//注意:dest需要有足够大的缓冲区,否则会越界
char szStr[] = {};
char szStr1[] = {};
int nNum = str.copy(szStr,); //拷贝str中前二个字符 szStr="ab" nNum=2
int nNum1= str.copy(szStr1,,); //从str下标1位置开始拷贝2个字符到szStr中,szStr1="bc" return;
}

string与char*

C++ STL(一)介绍及string的更多相关文章

  1. C++标准模板库(STL)介绍:string的基本用法

    1.带空格的字符串的输入 getline(cin, str)

  2. STL 算法介绍

    STL 算法介绍 算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成.        <algorithm ...

  3. STL学习笔记(string)

    动机 C++标准程序库中的string class使我们可以将string当做一个一般型别.我们可以像对待基本型别那样地复制.赋值和比较string, 再也不必但系内存是否足够.占用的内存实际长度等问 ...

  4. STL学习:STL库vector、string、set、map用法

    本文仅介绍了如何使用它们常用的方法. vector 1.可随机访问,可在尾部插入元素:2.内存自动管理:3.头文件#include <vector> 1.创建vector对象 一维: (1 ...

  5. C++_标准模板库STL概念介绍1-建立感性认知

    标准模板库的英文缩写是STL,即Standard Template Library. STL里面有什么呢? 它提供了一组表示容器.迭代器.函数对象和算法的模板. 容器是一个与数组类似的单元,可以存储若 ...

  6. C++ STL rope介绍----可持久化平衡树

    大致介绍: rope这个东西,我刚刚知道这玩意,用的不是很多,做个简单的介绍. 官方说明:我是刘邦(我估计你是看不懂的). rope就是一个用可持久化平衡树实现的“重型”string(然而它也可以保存 ...

  7. 跟我学STL系列(1)——STL入门介绍

    一.引言 最近这段时间一直都在自学C++,所以这里总结下自己这段时间的学习过程,通过这种方式来巩固自己学到的内容和以备后面复习所用,另外,希望这系列文章可以帮助到其他自学C++的朋友们. 由于本人之前 ...

  8. STL容器介绍(转)

    STL的容器可以分为以下几个大类: 一:序列容器, 有vector, list, deque, string. 二 : 关联容器,     有set, multiset, map, mulmap, h ...

  9. STL容器介绍

    STL的容器可以分为以下几个大类: 一:序列容器, 有vector, list, deque, string. 二 : 关联容器,     有set, multiset, map, mulmap, h ...

随机推荐

  1. php ceil()函数 语法

    php ceil()函数 语法 ceil()函数怎么用? php ceil()函数的作用是向上舍入为最接近的整数,语法是ceil(number),表示返回不小于参数X的下一个整数,如果没有小数,返回参 ...

  2. mybatis中递归查询

    业务是这样的,一个商品有不同的规格,所有规格选择完后会出现价格,这些规格我是放在一个表里,父子级关系.mybatis做的时候传过来一个商品Id.然后根据商品id去找所有的规格. <?xml ve ...

  3. 在idea下开发出现404错误

    用idea开发时,我们一般要设置project strucure里的Modules-Sources,里面对应的有Sources,tests,Resources,Test Resources, Excl ...

  4. iOS 技能图谱

    # iOS 技能图谱## 编程语言 - Swift - Objective-C - C++/C - JavaScript ## 操作系统 - Mac OSX - iOS - watchOS - tvO ...

  5. Mac启动时:boot task failed:fsck-safe处理办法

    mac系统启动到一半,然后突然关机,查看启动信息发现:boot task failed:fsck-safe 处理方法,clover启动的时候按空格,然后选择sigle mode. 进入使用命令:fsc ...

  6. error LNK2001: 无法解析的外部符号 __imp__Shell_NotifyIconA@8

    编译链接报错 error LNK2001: 无法解析的外部符号 __imp__Shell_NotifyIconA@8 解决方案: 在代码中添加链接库Shell32.lib #pragma commen ...

  7. 析构中delete this

    查看下面代码如何出错 #include <iostream> using namespace std; class A { public: A() { p = this; } ~A() { ...

  8. NetworkComms V2版本与V3版本语法的差异

    NetworkComms网络通信框架序言 NetworkComms通信框架中V3版本是一次重要的升级,底层做了诸多改变,但语法上与V2版本相比,差不并不大. 监听端口: V3中 IPEndPoint ...

  9. 监督局部线性嵌入算法(SLLE算法)

    % SLLE ALGORITHM (using K nearest neighbors) % % [Y] = lle(X,K,dmax,a) % % X = data as D x N matrix ...

  10. UVA 212 Use of Hospital Facilities

    题目链接:https://vjudge.net/problem/UVA-212 题意摘自<算法禁赛入门经典> 题目大意 医院里有 N(N ≤ 10)个手术室和 M(M ≤ 30)个恢复室. ...