STL是 C++标准模板库 Standard Template Library 的缩写,STL是C++为使用者提供的实现好的容器,包括vector、队列、栈、string等,掌握其对于程序的编写大有裨益。
vector一词翻译为矢量、向量、载体,在STL中它是一个“可以根据需要自动改变长度的动态数组”,普通的数组因为声明时长度是硬编码的,所以有时会出现预先定义的容量容纳不下的情况,这种情况使用vector就可以很好地解决。
vector的使用需要添加头文件,以及名空间 using namespace std;
vector name;
typename可以是任意已定义的类型,例如:vector num;
允许嵌套: vector > stu; //两个>>之间加一个空格防止被视为移位运算符```
vector允许像普通数组一样用下标来访问,但除了这种方式还可以通过迭代器(iterator)来访问vector内元素,迭代器可以理解为一种指针,它可以指向vector容器内的元素从而访问。
它的使用方法如下:
vector::iterator it; //it是我们给这个迭代器起的名字
vector num;
it = num.begin(); // begin方法获取vector首地址
for(int i=0; i
vector nums;
for(int i=0; i<3; i++){
nums.push_back(i); //将0-2依次加入vector
}
vector nums;
while(nums.size()>0){
nums.pop_back();
}
vector nums;
int len = nums.size();
empty( ) ——判断vector是否为空,空则返回真,非空则返回假
此外还有一些次常用的函数如:
vector nums;
...
nums.clear() //清空vector中的所有函数
nums.insert(nums.begin()+2,10); //在nums[2]的位置插入一个元素10
nums.erase(nums.begin()+2); //删除nums[2]
queue实现了一个队列容器,满足先进先出
使用需要括入头文件,并添加 using namespace std;
如 queue
queue只能通过front( )访问队首元素 或者 back( )访问队尾元素,如
line.front()
line.back();
push(x)——将x进行入队
pop( )——令队首元素出队
front( ) 和 back( )访问队首和队尾元素,注意访问前先判断队列是否为空
empty( ) 判断队列是否为空,空则返回真,非空则返回假
size( ) 返回队列内元素个数
stack实现了一个栈容器,满足后进先出
使用需要括入头文件,并添加 using namespace std;
如 stack
stack只能通过top( )访问栈顶元素
代码示例:
#include
#include
using namespace std;
int main(){
stack st;
for(int i=0; i<3; i++){
st.push(i);
}
printf("栈内元素个数为:%d\n",st.size());
while(st.size()>0){ //对栈内元素依次访问
printf("%d ",st.top());
st.pop();
}
return 0;
}
这次总结了vector、queue和 stack三种STL容器最基础的一些操作,新手的话掌握这些其实就够了,其他的需要用的时候再探索即可。
可以看出,这三种容器的定义方式都是一样的 ,访问则是依照各自的特点来,队列可以访问队首和队尾,栈只能访问栈顶。
而对于最基本的增删操作,stack和queue类似,都是push(x), pop( ),而vector则是push_back(x) 和 pop_back( )。
在C语言中通常都是采用字符数组char str[ ]这样的方式来存储字符串的,string并不是C/C++中的基本数据类型之一,它是C++在STL中新加入的一种泛型类,对字符串常用的功能需求进行了封装,操作起来更为便捷,功能更强大。
string的使用需要括入头文件 < string >, 并添加using namespace std; 注意此头文件与
需要提的一点是,string和char[ ] 是两种不同的数据类型,尽管它们所包含的字符元素类型都是一样的,但不能把对字符数组的操作直接迁移到string上,比如:
string str1;
scanf("%s",str1);
...
printf("%s",str1);
这样的写法都是不对的,对于string类型我们一般采用cin和cout进行输入和输出,如果非要使用scanf和printf也可以,但要做如下修改:
string str1;
scanf("%s",&str1[0]);
...
printf("%s",str1.c_str()); //使用c_str方法转换成字符数组
此外要用字符指针指向string内的字符元素时也需要改成:
char * p = &str[0];
但是更推荐大家使用迭代器的方式(后面介绍了)。
string的定义有很多种,最简单的就是直接 string str;或者string str=“abc”;再或者 string str(str1); //拷贝初始化等
string可以像字符数组一样通过下标访问每一个字符,也可以用迭代器进行访问如:
string str = "abcde";
string::iterator it = str.begin(); //语法就和其他STL容器一样
while(it!=str.end()){ //迭代器不支持it
string str1 = "123";
string str2 = "abc";
string str0 = str1 + str2;
那么str0的值就是“123abc”
比较运算——两个string类型可以直接用==、!= 、< 、<= 、>、 >= 比较大小,比较规则是字典序
length() / size()——返回string的长度,即存放的字符数
insert(start,str1)——在下标为start的位置前插入字符串str1
string str = "0123";
string str1 = "abc";
str.insert(1,str1);
str的值将变成 “0abc123”
如果超出字符串的界限则只输出到串的末尾。
string str0 ="012345";
string str1 = str0.substr(0,3);
string str2 = str0.substr(4,3);
执行完str1的值为 “012”, str2的值为 “45”。
string也可以像vector一样在尾部添加或删除元素,这一特性在做一些算法题的时候非常实用
string str="abc";
str.push_back('x');
cout<
输出结果:
abcx
abc