#includeusing namespace std; #include #include void MyPrint(int val) { cout << val << endl; } void test01() { //创建vector容器对象,并且通过模板参数指定容器中存放的数据的类型 vector v; //向容器中放数据 v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40); //每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素 //v.begin()返回迭代器,这个迭代器指向容器中第一个数据 //v.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置 //vector ::iterator 拿到vector 这种容器的迭代器类型 vector ::iterator pBegin = v.begin(); vector ::iterator pEnd = v.end(); //第一种遍历方式: while (pBegin != pEnd) { cout << *pBegin << endl; pBegin++; } cout << endl; //第二种遍历方式: for (vector ::iterator it = v.begin(); it != v.end(); it++) { cout << *it << endl; } cout << endl; //第三种遍历方式: //使用STL提供标准遍历算法 头文件 algorithm for_each(v.begin(), v.end(), MyPrint); } int main() { test01(); return 0; }
输出结果
10 20 30 40 10 20 30 40 10 20 30 405.2 Vector 存放自定义数据类型 学习目标: vector 中存放自定义数据类型,并打印输出 示例:
#include#include //自定义数据类型 class Person { public: Person(string name, int age) { mName = name; mAge = age; } public: string mName; int mAge; }; //存放对象 void test01() { vector v; //创建数据 Person p1("aaa", 10); Person p2("bbb", 20); Person p3("ccc", 30); Person p4("ddd", 40); Person p5("eee", 50); v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4); v.push_back(p5); for (vector ::iterator it = v.begin(); it != v.end(); it++) { cout << "Name:" << (*it).mName << " Age:" << (*it).mAge << endl; cout << "Name:" << it->mName << " Age:" << it->mAge << endl; } } //放对象指针 void test02() { vector v; //创建数据 Person p1("aaa", 10); Person p2("bbb", 20); Person p3("ccc", 30); Person p4("ddd", 40); Person p5("eee", 50); v.push_back(&p1); v.push_back(&p2); v.push_back(&p3); v.push_back(&p4); v.push_back(&p5); for (vector ::iterator it = v.begin(); it != v.end(); it++) { Person* p = (*it); cout << "用指针打印" << "*Name:" << p->mName << " Age:" << (*it)->mAge << endl; cout << "用指针打印" << "*Name:" << (*p).mName << " Age:" << (*p).mAge << endl; } } int main() { test01(); test02(); return 0; }
输出结果
Name:aaa Age:10 Name:aaa Age:10 Name:bbb Age:20 Name:bbb Age:20 Name:ccc Age:30 Name:ccc Age:30 Name:ddd Age:40 Name:ddd Age:40 Name:eee Age:50 Name:eee Age:50 用指针打印*Name:aaa Age:10 用指针打印*Name:aaa Age:10 用指针打印*Name:bbb Age:20 用指针打印*Name:bbb Age:20 用指针打印*Name:ccc Age:30 用指针打印*Name:ccc Age:30 用指针打印*Name:ddd Age:40 用指针打印*Name:ddd Age:40 用指针打印*Name:eee Age:50 用指针打印*Name:eee Age:505.3 Vector 容器嵌套容器 学习目标:容器中嵌套容器,我们将所有数据进行遍历输出 示例:
//容器嵌套容器
void test01()
{
vector< vector > v;
vector v1;
vector v2;
vector v3;
vector v4;
for (int i = 0; i < 4; i++)
{
v1.push_back(i + 1);
v2.push_back(i + 2);
v3.push_back(i + 3);
v4.push_back(i + 4);
}
//将容器元素插入到vector v中
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
for (vector>::iterator it = v.begin(); it != v.end(); it++)
{
cout << endl;
for (vector::iterator vit = (*it).begin(); vit != (*it).end(); vit++)
{
cout << *vit << " ";
}
cout << endl;
}
}
int main()
{
test01();
return 0;
}
输出结果
1 2 3 4 2 3 4 5 3 4 5 6 4 5 6 76 STL- 常用容器 6.1 string 容器 6.1.1 string 基本概念 本质: string 是 C++ 风格的字符串,而 string 本质上是一个类 string和char * 区别: 1.char * 是一个指针 2.string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器 特点: string 类内部封装了很多成员方法 例如:查找 find ,拷贝 copy ,删除 delete 替换 replace ,插入 insert string 管理 char* 所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责 6.1.2 string 构造函数 构造函数原型:
string(); //创建一个空的字符串 例如: string str; string(const char* s ); //使用字符串s初始化 string(const string& str ); //使用一个string对象初始化另一个string对象 string(int n , char c ); //使用n个字符c初始化示例:
//string构造
void test01()
{
//1.创建空字符串,调用无参构造函数
string s1;
cout << "str1 = " << s1 << endl;
//2.把c_string转换成了string
const char* str = "hello world";
string s2(str);
cout << "str2 = " << s2 << endl;
//3.调用拷贝构造函数
string s3(s2);
cout << "str3 = " << s3 << endl;
//4.使用n个字符c初始化
string s4(10, 'a');
cout << "str3 = " << s3 << endl;
}
int main()
{
test01();
return 0;
}
输出结果
str1 = str2 = hello world str3 = hello world str3 = hello world总结: string的多种构造方式没有优劣,灵活使用即可 6.1.3 string 赋值操作 功能描述: 给 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赋给当前字符串示例:
//赋值
void test01()
{
string str1;
str1 = "hello world";
cout << "str1 = " << str1 << endl;
string str2;
str2 = str1;
cout << "str2 = " << str2 << endl;
string str3;
str3 = 'a';
cout << "str3 = " << str3 << endl;
string str4;
str4.assign("hello c++");
cout << "str4 = " << str4 << endl;
string str5;
str5.assign("hello c++",5);
cout << "str5 = " << str5 << endl;
string str6;
str6.assign(str5);
cout << "str6 = " << str6 << endl;
string str7;
str7.assign(5, 'x');
cout << "str7 = " << str7 << endl;
}
int main()
{
test01();
return 0;
}
输出结果
str1 = hello world str2 = hello world str3 = a str4 = hello c++ str5 = hello str6 = hello str7 = xxxxx总结: string的赋值方式很多, operator= 这种方式是比较实用的 6.1.4 string 字符串拼接 功能描述: 实现在字符串末尾拼接字符串 函数原型:
string& operator+=(const char* str); //重载+=操作符 string& operator+=(const char c); //重载+=操作符 string& operator+=(const string& str); //重载+=操作符 string& append(const char *s); //把字符串s连接到当前字符串结尾 string& append(const char *s, int n); //把字符串s的前n个字符连接到当前字符串结尾 string& append(const string &s); //同operator+=(const string& str) string& append(const string &s, int pos, int n); //字符串s中从pos开始的n个字符连接到字符串结尾示例:
//字符串拼接
void test01()
{
string str1 = "我";
str1 += "爱玩游戏";
cout << "str1 = " << str1 << endl;
str1 += ':';
cout << "str1 = " << str1 << endl;
string str2 = "LOL DNF";
str1 += str2;
cout << "str1 = " << str1 << endl;
string str3 = "I";
str3.append(" love ");
str3.append("game abcde", 4);
//从下标4位置开始 ,截取3个字符,拼接到字符串末尾
str3.append(str2, 4, 3);
cout << "str3 = " << str3 << endl;
}
int main()
{
test01();
return 0;
}
输出结果
str1 = 我爱玩游戏 str1 = 我爱玩游戏: str1 = 我爱玩游戏:LOL DNF str3 = I love gameDNF
总结:
字符串拼接的重载版本很多,初学阶段记住几种即可
6.1.5 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示例:
//查找和替换
void test01()
{
//查找
string str1 = "abcdefgde";
int pos = str1.find("de");
if (pos == -1)
{
cout << "未找到" << endl;
}
else
{
cout << "pos = " << pos << endl;
}
pos = str1.rfind("de");
cout << "pos = " << pos << endl;
}
void test02()
{
//替换
string str1 = "abcdefgde";
str1.replace(1, 3, "1111");
cout << "str1 = " << str1 << endl;
}
int main()
{
test01();
test02();
return 0;
}
输出结果
pos = 3 pos = 7 str1 = a1111efgde总结: fifind查找是从左往后,rfifind从右往左 fifind找到字符串后返回查找的第一个字符位置,找不到返回-1 replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串 6.1.6 string 字符串比较 功能描述: 字符串之间的比较 比较方式: 字符串比较是按字符的 ASCII 码进行对比 = 返回 0 > 返回 1 < 返回 -1 函数原型:
int compare(const string &s) const; //与字符串s比较 int compare(const char *s) const; //与字符串s比较示例:
//字符串比较
void test01()
{
string s1 = "hello";
string s2 = "aello";
int ret = s1.compare(s2);
if (ret == 0)
{
cout << "s1 等于 s2" << endl;
}
else if (ret > 0)
{
cout << "s1 大于 s2" << endl;
}
else
{
cout << "s1 小于 s2" << endl;
}
}
int main()
{
test01();
return 0;
}
输出结果
s1 大于 s2总结: 字符串对比主要是用于比较两个字符串是否相等,判断谁大谁小的意义并不是很大 6.1.7 string 字符存取 string 中单个字符存取方式有两种
char& operator[](int n); //通过[]方式取字符 char& at(int n); //通过at方法获取字符示例:
void test01()
{
string str = "hello world";
for (int i = 0; i < str.size(); i++)
{
cout << str[i] << " ";
}
cout << endl;
for (int i = 0; i < str.size(); i++)
{
cout << str.at(i) << " ";
}
cout << endl;
//字符修改
str[0] = 'x';
str.at(1) = 'x';
cout << str << endl;
}
int main()
{
test01();
return 0;
}
输出结果
h e l l o w o r l d h e l l o w o r l d xxllo world总结: string字符串中单个字符存取有两种方式,利用 [ ] 或 at 6.1.8 string 插入和删除 功能描述: 对 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个字符示例:
//字符串插入和删除
void test01()
{
string str = "hello";
str.insert(1, "111");
cout << str << endl;
str.erase(1, 3);
//从1号位置开始3个字符
cout << str << endl;
}
int main()
{
test01();
return 0;
}
输出结果
h111ello hello总结: 插入和删除的起始下标都是从0开始 6.1.9 string 子串 功能描述: 从字符串中获取想要的子串 函数原型:
string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串示例:
//子串
void test01()
{
string str = "abcdefg";
string subStr = str.substr(1, 3);
cout << "subStr = " << subStr << endl;
string email = "hello@sina.com";
int pos = email.find("@");
string username = email.substr(0, pos);
cout << "username: " << username << endl;
}
int main()
{
test01();
return 0;
}
输出结果
subStr = bcd username: hello总结: 灵活的运用求子串功能,可以在实际开发中获取有效的信息



