1.STL基本概念:
- STL(Standard Template Library,标准模板库)
- STL从广义上分为: 容器(container) ,算法(algorithm)迭代器(iterator)
- 容器和算法之间通过迭代器进行无缝连接;
- STL几互所有的代码都采用了模板类或者模板函数;
2.STL六大组件
STL大体分为六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
- 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
- 算法:各种常用的算法,如sort、find、copy、for_each等
- 迭代器:扮演了容器与算法之间的胶合剂。
3.STL-常用容器
1) string容器:
- string基本概念本质:string是C++风格的字符串,而string本质上是一个类string和char *区 别:char *是一个指针,string是一个类,类内部封装了char*,管理这个 字符串是一个char*型的容器。
- 特点:string类内部封装了很多成员方法例如:查找find,拷贝copy,删除delete替换 replace,插入是insert.string管理char*所分配的内存,不用担心复制越界和取值越界 等,由类内部进行负责.
- string构造函数,可以创建一个空的字符串,拷贝构造,也可以直接初始化;头文件要包含 #include<string> 不同容器有不同的头文件,都是把容器名称包含进去,不然会 报错。
void test01()
{ string s1;//创建空字符串,调用无参构造函数
cout<<"str1="<<s1<<endl;
const char*str="helloworld";
strings2(str);//把c_string转换成了string
cout<<"str2="<<s2<<endl;
strings3(s2); //调用拷贝构造函数
cout<<"str3="<<s3<<endl;
strings4(10,'a');
cout<<"str3="<<s3<<endl;
}
main()
{
test01();
system("pause");
return
0;
}
- string 的赋值操作,有多种赋值方式:1)可以将char*类型字符串赋值给当前的字符串 2)把字符串s赋给当前的字符串 3)字符赋值给当前的字符串 4)把字符串s的前n个字符赋给当前的字符串 5)把字符串s赋给当前字符串 6)用n个字符c赋给当前字符串;
void test02()
{
string str1;
str1="str1";
cout<<"str1="<<str1<<endl;
string str2;
str2=str1;
cout<<"str2="<<str2<<endl;
string str3;
str3='a';//可以单个字符;
cout<<"str3="<<str3<<endl;
string str4;
str4.assign("str4");//把字符串给当前的字符串;
cout<<"str4="<<str4<<endl;
string str5;
str5.assign("str5....",5);
cout<<"str5="<<str5<<endl;
string str6;
str6.assign(str5);
cout<<"str6="<<str6<<endl;
string str7;
str7.assign(10,'2');
cout<<"str7="<<str7<<endl;
}
- 字符串的连接 string&operator+=(constchar*str);//重载+=操作符 string&operator+=(constcharc);//重载+=操作符 string&operator+=(conststring&str);//重载+=操作符 string&append(constchar*s);//把字符串s连接到当前字符串结尾string&append(constchar*s,intn);//把字符串s的前n个字符连接到当前字符串结尾
void test03()
{
string st1;
st1="i";
cout<<"st1="<<st1<<endl;
st1+="like you";//追加一个字符串;
cout<<"st1="<<st1<<endl;
st1+=";";//追加一个字符串;
cout<<"st1="<<st1<<endl;
string st2;
st2="yes,";
st2+=st1;
cout<<"st2="<<st2<<endl;
string st3="you ";
st3.append("like ");
cout<<"st3="<<st3<<endl;
string st4;
st4=st3;
st4.append("me too",2);
cout<<"st4="<<st4<<endl;
}
- string 字符串的查找(find and rfind 的区别: rfind 是从右往左找,find是从左往右找;输出的下标是第一次找到的位置; )
//字符串的查找和替换;
void test04()
{
string stri1="abcdefghc";
int pos=stri1.find("a");
cout<<"pos="<<pos<<endl; //输出的是第一次找到的位置的下标 ;没有找到这个子字符串返回-1;
if(pos==-1)
cout<<"no find";
else cout<<"find,OK,下标为:"<<pos<<endl;
//find and rfind 的区别: rfind 是从右往左找,find是从左往右找;输出的下标是第一次找到的位置;
//rind;
int pos1=stri1.rfind("c");
cout<<"pos的下标为:"<<pos1<<endl;
}
- string 的替换(在代码后面有一些需要需要注意的有标注)
void test05()
{
string str1="abcdefghijklmn";
str1.replace(3,3,"aaaaa"); //三个参数,从哪个字符开始,到哪个字符串,要替换成什么;
cout<<"str1="<<str1<<endl;//结果会将要替换的字符串都替换进去,不会受要替换的个数(即中间的参数)影响;
}
- 字符串的比较
void test06()
{
string str1="hello";
string str2="hello";
if(str1.compare(str2)==0 )
{
cout<<"str1=str2"<<endl;
}
else if(str1.compare(str2)==1)
cout<<"str1>str2"<<endl;
else cout<<"str1<str2"<<endl;
}
2) vector容器(要包含头文件#include<vector>)
- vector基本概念功能:vector数据结构和数组非常相似,也称为单端数组。
- vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展动态扩展:并不是 在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。
- ----------------------------------------------------------------------------------------------------------------------
- vector构造函数:vector<T>v;//采用模板实现类实先, 默认构造函数 vector(v.begin(),v.end());//将v[begin(), end())区间中的元素拷贝给本身。 vector(n,elem);//构造函数将n个elem拷贝给本身。 vector(constvector&vec);//拷贝构造函数。
//打印容器的内容
void print(vector<int> &v)
{
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
void test01()
{
vector<int> v;//默认构造函数,无参构造;
for(int i=0;i<10;i++)
{
v.push_back(i);
}
print(v);
//通过区间方式进行构造;
vector<int>v2(v.begin(),v.end());
print(v2);
//个elem 构造
vector<int>v3(10,100);//前面参数是个数,后面的是值;
print(v3);
//拷贝构造
vector<int>v4(v3);
print(v4);
}
- vector容量和大小功能描述:对vector容器的容量和大小操作函数原型: empty();//判断容器是否为空 capacity();//容器的容量size();//返回容器中元素的个数; resize(int num);//重新指定容器的长度为num,若容器变长,则 以默认值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。 resize(int num,elem);//重新指定容器的长度为num,若容器变 长,则以elem值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删
- vector插入和删除
push_back(ele);//尾部插入元素ele; pop_back();//删除最后一个元素 insert(const_iteratorpos,ele);//迭代器指向位置pos插入元素ele insert(const_iteratorpos,intcount,ele);//迭代器指向位置pos插入count个元素ele erase(const_iteratorpos);//删除迭代器指向的元素 erase(const_iterator start,const_iterator end);//删除迭代器从start到end之间的元素 clear();//删除容器中所有元素
- 对vector 中元素的存取取操作 at(intidx);//返回索引idx所指的数据 operator[];//返回索引idx所指的数据 front();//返回容器中第一个数据元素 back();//返回容器中最后一个数据元素
对于其他它容器请看下一篇;
本内容转至:布尔博客