用STL写一个简单的程序
本博客讲解了用STL的思想去写一个基本的程序,学习笔记写在了代码的注释中了
#include <iostream>
#include <vector>//动态数组 可变数组
#include<algorithm>//大部分算法都定义在这个头文件中
using namespace std;
//用到那个容器,就写那个容器的头文件
void print(int a)
{
cout<<a<<" ";
}
void test01()
{
vector<int> a;//模板参数,需要放什么类型的元素,想要放什么类型的元素,就设置成什么。这样定义一个容器,并且制定这个容器存放的类型是int;
//既然有容器,那就应该有方法,例如插入删除增加
a.push_back(10);//把这个10的元素放到这个容器的尾部
a.push_back(20);//数据空间不足的话,自己会进行一个增长
a.push_back(30);
a.push_back(40);
//容器提供迭代器
//对此进行一个遍历,for_each();有两个参数,开始迭代器,和结束迭代器,和回调函数
//容器提供迭代器,既然自己提供迭代器
//a.begin()就自己返回了一个迭代器,先拿到迭代器的类型,容器在加加减减的过程中
//也可以先拿到这个容器的迭代器类型,
vector<int>::iterator pbegin = a.begin();//begin指向第一个元素
vector<int>::iterator pend = a.end();//最后一个元素,
for_each(pbegin,pend,print);//需要一个回调函数,可能存放基础的数据类型,也可能存放自定义的数据类型,每次调用我们的回调函数进行打印,
//对这个容器进行一个遍历,可以用for_each进行遍历
}
//容器也可以存放自定义的数据类型
//下面用容器来创建一个自定义类
class Person
{public:
Person(int n=0, int a=0) :num(n), age(a) {}//用构造函数对成员列表进行初始化
public:
int num, age;
};
void Test02()
{
//创建容器,并且制定容器的数据类型为Person
vector<Person> v;
Person p1(10, 20);
Person p2(30, 40);
v.push_back(p1);
v.push_back(p2);//也可以使用这种方法增加容器中的元素
for (vector <Person>::iterator it = v.begin(); it != v.end(); it++)//自己写一个遍历函数,创建一个变量it
{
cout << (*it).age << " " << (*it).num << endl;//*it可以*出现在指向迭代器指向的元素;
}
}
void Test03()
{
;
}
int main()
{
test01();
Test02();
return 0;
}
string容器讲解
string容器常用的API
string 构造函数
string();//创建一个空的字符串
string(const string& str);//使用一个string对象初始化另一个string对象
string(const char* s);//使用字符串s初始化
string(int n,char c);//使用n个字符c初始化
string赋值操作
string& operator=(const char* s);//char*类型字符串 赋值给当前的字符串
string& operator=(const string &s);//把字符串s赋值给当前的字符串
string& operator=(char c);//字符赋值给当前的字符串
string& assign(const char* s);//把字符串s赋值给当前的字符串
string& assign(const char* s,int n);//把字符串s的前n个字符赋值给当前的字符串
string& assign(const string &s);//把字符串s赋值给当前的字符串
string& assign(int n,char c);//用n个字符c赋值给当前字符串
string& assign(const string &s,int start,int n);//将s从start开始n个字符赋值给字符串
string 存取字符操作
char& operator[](int n);//通过【】方式取字符
char& at(int n);//通过at方法获取字符
string拼接操作
string& operator+=(const string& str);//重载+=运算符
string& operator+=(const char* str);//重载+=运算符
string& operator+=(const char c);//重载+=运算符
string& append(const char *s);//把字符串s连接到当前字符串结尾
string& append(const char *s,int n);//把字符串s的前n个字符连接到当前字符串结尾
string& append(const string &s);//同operator+=()
string& append(const string &s,int pos,int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾
string& append( int n,char c);//在当前字符串结尾添加n个字符c
string查找和替换
int find(const string& str,int pos = 0)const;//查找str第一次出现的位置,从pos开始查找
int find(const char* s,int pos = 0)const;//查找s第一次出现位置,从pos开始查找
int find(const char *s,int pos,int n)const;//从pos位置查找s的前n个字符第一次位置
int find(const char c,int pos = 0)const;//查找字符c第一次出现位置
int rfind(const string& str, int pos = npos)const;//查找str最后一次出现位置,从pos开始查找
int rfind(const char* s,int pos = npos)const;//查找s最后一次出现位置,从pos开始查找
int rfind(const char* s,int pos,int n )const;//从pos查找s的前n个字符最后一次位置
int rfind(const char c,int pos = 0)const;//查找字符c最后一次出现位置
string& replace(int pos,int n,const string& str);//替换从pos开始的n个字符为字符串str
string& replace(int pos,int n,const char* s);//替换从pos开始的n个字符为字符串s
string比较操作
int compare(const string &s)const;//与字符串s比较
int compare(const char*s)const;//与字符串s比较
string字串截取
string substr(int pos = 0,int n = npos)const;//返回由pos开始的n个字符组成的字符串
string插入和删除操作
string& insert(int pos,const char* s);//插入字符串
string& insert(int pos,const string &str);//插入字符串
string& insert(int pos,int n,char c);//在指定位置插入n个字符c
string& erase(int pos,int n = npos);//删除从pos开始的n个字符
对上面API进行的代码试验
在运行代码时,请自己改变一下Test0x()的x数值,进行各个函数的调控
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
void Test01()
{
char c[] = "asda";
string a = "asda";
string b;
//string 提供了一个成员方法进行赋值
b.assign("asdasd");
//string b = as;//把字符串赋值给当前字符串
cout << b;
}
void Test02()
{
string s1 = "asdasdasdfd";
for (int i = 0; i < s1.size(); i++)
{
cout << s1[i] << " ";
}
cout << endl;
//at成员函数
for (int i = 0; i < s1.size(); i++)
{
cout << s1.at(i);
}
//[]方式如果访问越界了,直接挂点了
//如果at访问失败了,他会进行抛异常
try
{
cout << s1.at(100);
//out << s1[100];可以对这两行代码进行分别测试,可以发现at方法会进行抛出异常
}
catch(...)
{
cout << "YOU are sb";
}
}
//拼接操作
void Test03()
{
string s = "I love you ";
s += "asd";
string s3 = "222";
s.append(s3);//这个成员方法是把s3添加到s的尾部
string s4 = s + s3;
cout <<s4;
}
//查找操作
void Test04()
{
string s = "abcdegfjlf";
int pos=s.find("f");//查找f第一次出现的位置
cout << pos;
int pos2 = s.rfind("f");//查找f最后一次出现的位置
int pos3 = s.find("asfsadgfsgadsfas");
cout << pos3;//如果没有的话会返回-1;
cout << pos2;
}
//替换操作
void Test05()
{
string s = "abcdefg";
s.replace(0, 2, "123");//把ab替换成了123,第0个位置到第2个位置
cout << s;
}
//字符串比较
void Test06()
{
string s1 = "abcd";
string s2 = "abcdef";
//比较的时候按照ASCII码进行比较
//大于时返回1,等于时返回0,小于时返回-1;
if (s1.compare(s2) == 0)
{
cout << "sad";
}
}
//子串操作
void Test07()
{
string s = "abcdefg";
string my=s.substr(1, 4);//截取从1到4的字符串
cout << my;
}
//字符串的插入和删除
void Test08()
{
string s = "asdasdasdfa";
s.insert(3, "111");//插入字符串,从第三个前面插入
cout << s;
s.erase(0, 2);//指定区间删除
cout << s;
}
int main()
{
Test07();
return 0;
}