以下内容仅为当前认识,可能有不足之处,欢迎讨论!
文章目录
- STL初步认识
- vector存放内置数据类型
- vector存放自定义数据类型
- vector 嵌套容器
STL初步认识
回顾时,需要回答自己
①STL是什么?
②STL怎么用?
③STL优势是什么?
④STL是为了解决什么问题存在的技术?
为了提升代码的复用性,建立数据结构和算法的一套标准,诞生了STL。
STL=Standard Template Library=标准模板库。
STL广义上分为:①容器,②算法,③迭代器。其中,迭代器为容器和算法提供了桥梁,使得彼此有连接。
STL几乎所有代码采用了模板类或者模板函数。
STL六大组件
容器:各种数据结构,如vector,list,deque,set,map等,存放数据用的。
算法:常用算法,如sort,find,copy,for_each等。
迭代器:容器和算法之间的胶合剂。{我理解为桥梁}
仿函数:{重载函数小括号}:行为类似函数,可作为算法的某种策略。
适配器:多个参数传递,组装操作。——一种用来修饰容器或者仿函数或迭代器接口的东西。
空间配置器:容器用时,开辟到堆区,自动管理空间配置和管理。
容器&算法&迭代器之具体
容器作用:将运用最广泛的数据结构实现出来。
常用数据结构:数组,链表,树,栈,队列,集合,映射表等。
序列式容器{我理解为顺序数据结构}:强调值的排序,序列式容器中每个元素有固定位置。
关联式容器{我理解为链表}:二叉树结构,各元素之间没有严格的物理的顺序关系。
算法:
质变算法&非质变算法
质变算法:运算过程中更改区间元素的内容,例如拷贝,替换,删除等。
{我理解为对元素本身更改。}
非质变算法:运算过程中不会更改区间的元素内容,例如查找,计数,遍历,寻找极值等。
{我理解为对元素本身修改了。}
迭代器:提供方法,能够按照顺序访问容器所含各个元素,又无需暴露该容器的内部表示方式。
每个容器有其专属的迭代器。
迭代器使用类似于指针。先理解为迭代器。
vector存放内置数据类型
vector遍历
容器:vector
算法:for_each
迭代器:vector<int>::iterator
vector一个简单案例,使用C++自带的模板实现数组,并且有三种方式遍历。
第一种方式易读,但冗余。
第二种方式适中。
第三种方式需要理解在说什么。
每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素。
v.begin()返回迭代器,这个迭代器指向容器中第一个数据。
v.end()返回迭代器,这个迭代器只想容器元素的最后一个元素的下一个位置。
vecotr<int>::iterator 拿到vector这种容器的迭代器类型。
代码示例:
#include<iostream>
#include<string>
using namespace std;
#include"CommonArray.hpp"
#include<vector>
#include<algorithm>
void Method_A(vector<int> &myVec) {
//通过迭代器访问容器数据
vector<int>::iterator itBegin = myVec.begin();
//起始迭代器,指向容器第一个元素
vector<int>::iterator itEnd = myVec.end();
//结束迭代器,指向容器最后一个元素的下一个位置
//vector<int>::iterator 拿到vector<int>这种容器的迭代器类型
while (itBegin != itEnd) {
cout << *itBegin << endl;
itBegin++;
//起始指针+1
}
}
void Method_B(vector<int>& myVec) {
for (vector<int>::iterator it = myVec.begin(); it != myVec.end(); it++) {
cout << *it << endl;
}
}
//这个参数要写什么内容?
//因为是int类型的模板,所以现在是传入整型。
void Print(int element) {
cout << element << endl;
}
//第三种遍历方式。利用STL提供的遍历算法。
//需要包含对应头文件。
void Method_C(vector<int>& myVec) {
for_each(myVec.begin(), myVec.end(), Print);
}
void test0403() {
//新建一个vector容器
vector<int> myVec;
myVec.push_back(15);
myVec.push_back(25);
myVec.push_back(35);
myVec.push_back(45);
//第一种方法
cout << "使用第一种方法遍历" << endl;
Method_A(myVec);
//第二种方法
cout << "\n使用第二种方法遍历" << endl;
Method_B(myVec);
//第三种方法
cout << "\n使用第三种方法遍历" << endl;
Method_C(myVec);
}
int main() {
test0403();
system("pause");
return 0;
}
运行结果:
vector存放自定义数据类型
存放自定义的数据类型。
仍然是把它当作一个指针来看待。需要注意的是,创建vector语句是:vector<自定义数据类型> 变量名;
,而创建迭代器的语句是:vector<自定义数据类型>::iterator 变量名2=变量名.begin();
代码示例:
#include<iostream>
#include<string>
using namespace std;
#include"CommonArray.hpp"
#include<ostream>
#include<vector>
#include<algorithm>
//使用vector存放自定义数据类型
class Person {
public:
Person(string name, int age) :person_name(name), person_age(age) {}
public:
string person_name;
int person_age;
};
ostream& operator<<(ostream& out, Person& person) {
//cout << person.person_name << "の年龄是" << person->person_age << "." << endl;
cout << person.person_name << "の年龄是" << person.person_age << "." << endl;
return out;
}
ostream& operator<<(ostream& out, Person* person) {
//cout << person.person_name << "の年龄是" << person->person_age << "." << endl;
cout << person->person_name << "の年龄是" << person->person_age << "." << endl;
return out;
}
void test0403() {
Person Chandler("Chandler", 36);
Person Ross("Ross", 35);
Person Monica("Monica", 32);
Person Febe("Febe", 33);
Person Joey("Joey", 34);
Person Rachel("Rachel", 33);
//第一种方式,使用Person类型的数组
vector<Person> Persons;
Persons.push_back(Chandler);
Persons.push_back(Ross);
Persons.push_back(Monica);
Persons.push_back(Febe);
Persons.push_back(Joey);
Persons.push_back(Rachel);
//Person类型的容器
cout << "Person类型的容器" << endl;
for (vector<Person>::iterator per = Persons.begin(); per != Persons.end(); per++) {
//第一种方式,per是指针,此时重写了左移运算符。
//per指针,那么*取值,就取道了对应的值。
cout << *per;
//cout << per->person_name << "の年龄是" << per->person_age << "." << endl;
}
cout << endl;
//如果是Person指针类型的容器
vector<Person*> PersonPointer;
//存放的是一组Person指针类型的数据,所以传入时要传地址
PersonPointer.push_back(&Chandler);
PersonPointer.push_back(&Ross);
PersonPointer.push_back(&Monica);
PersonPointer.push_back(&Febe);
PersonPointer.push_back(&Joey);
PersonPointer.push_back(&Rachel);
cout << "Person指针类型的容器" << endl;
//Person指针类型的容器
for (vector<Person*>::iterator pp = PersonPointer.begin(); pp != PersonPointer.end(); pp++) {
//pp为每一个元素的指针,取值后取得是每一个元素的地址,所以要取两次
cout << *pp;
}
}
int main() {
test0403();
system("pause");
return 0;
}
运行结果:
vector 嵌套容器
容器中另有一个容器。相当于二维数组。
代码实现:
#include<iostream>
#include<string>
using namespace std;
#include"CommonArray.hpp"
#include<ostream>
#include<vector>
#include<algorithm>
void test0403() {
vector<vector<int>> vec;
vector<int> tor1;
vector<int> tor2;
vector<int> tor3;
vector<int> tor4;
//分别向四个内层容器中添加元素。
for (int i = 0; i < 4; i++) {
tor1.push_back(i + 1);
tor2.push_back(i + 2);
tor3.push_back(i + 3);
tor4.push_back(i + 4);
}
vec.push_back(tor1);
vec.push_back(tor2);
vec.push_back(tor3);
vec.push_back(tor4);
//遍历嵌套容器
for (vector<vector<int>>::iterator vec_begin = vec.begin(); vec_begin != vec.end(); vec_begin++) {
//对内层容器遍历,vec_begin是指向容器的指针,所以要用*解引用
for (vector<int>::iterator tor_begin = (*vec_begin).begin(); tor_begin != (*vec_begin).end(); tor_begin++) {
cout<<*tor_begin<<" ";
}
cout<<endl;
}
}
int main() {
test0403();
system("pause");
return 0;
}
运行结果:
以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!