目录
1、STL的出现
c++中诞生STL是:为了建立数据结构算法的一套标准,并且降低其间的耦合关系以提高各自的独立性、弹性、交互操作性(相互合作性)。
- STL称为标准模板库,容器(类模型)和算法(函数模板)
- 三大组件:容器、算法、迭代器
仿函数(包含的一个内容)
- #include<vector>//模板的头文件
- #include<algorithm>//算法的头文件
- #include<iterator>//迭代器的头文件
2、STL的构成
①容器——vector、stack、queue、list、set(集合)、map(映射)、multiset...
存储元素
- 序列式容器:可序群集,
- 关联式容器:已序群集,元素位置取决于特定的排序准则和插入顺序
②算法——copy、sort、find、find_if、count、count_if、swap...
操作元素
③迭代器:容器和算法的粘合剂,可以将它认为指针
用迭代器将容器中的元素访问出来,然后通过算法来操作。类似:数组(容器)、算法(排序)、迭代器(指针)
④仿函数:称为函数对象(类似于函数的对象),将它放在当前的算法中,
可以将算法的功能得以扩展。
3、 理解测试代码
void print(int n)
{
cout << n << " ";
}
int g_sum = 0;
void sum(int n)
{
g_sum+=n;
}
template<class T>
class Print
{
public:
void operator()(T n)
{
cout << n << " ";
}
};
int main()
{
int num[5] = { 1,2,3,4,5 };
int numdest[5];
copy(num, num + 5, numdest);
vector<int> vv1;//空对象
vector<int> vv2(5);//有五个0
vector<int> vv3(4, 9);//有4个9
vector<int> vv4(num, num + 5);//int类型的区间
vector<int> vv5(vv4.begin(), vv4.end());//迭代器类型的区间
vector<int> vv6(vv3);
vector<int> vv7;
vv7 = vv2;
int i;
vv4[3] = 20;//赋值为20,如果没有赋值就不能用
for (i = 0;i < vv4.size();i++)
cout << vv4[i] << " ";//对象[]重载
cout << endl;
vv1.push_back(1);
vv1.push_back(2);
vv1.push_back(3);
vector<int>::iterator iter;//迭代器(iterator)指向vector <int>类型
// iter++;//指向下一个元素
//①begin是指向第一个元素,end是指向最一个元素的下一个
for (iter = vv1.begin();iter != vv1.end();iter++)
cout << *iter << " ";//重载*
cout << endl;
//②front是指向第一个元素,back是指向最后一个元素
cout << "fornt:" << vv1.front() << endl;
cout << "bakc:" << vv1.back() << endl;
cout << "assign:" << endl;
vv1.assign(5, 6);//用5个6给vv1重新赋值
vv1.assign(num, num + 5);
vv1.assign(vv4.begin(), vv4.begin() + 3);
cout << "用copy实现" << endl;
copy(vv4.begin(), vv4.end(),ostream_iterator<int>(cout," "));
cout << endl;
cout << "用for_each实现" << endl;
for_each (vv4.begin(), vv4.end(), print);
cout << endl;
for_each(vv4.begin(), vv4.end(), Print<int>());
for_each(vv4.begin(), vv4.end(),sum);
cout << "g_sum=" << g_sum << endl;
vv1.at(2) = 50;//把vv1[2]的值改成50
cout << "at:" << "[]" << vv1.at(2) << endl;//vv1[1]
vv1.clear();//清空
cout << "vv1.size=" << vv1.size() << endl;
vv4.emplace(vv4.begin(), 100);
vv4.emplace_back(200);
vv4.erase(vv4.begin() + 2, vv4.begin() + 4);//前闭后开的区间
vv4.erase(vv4.begin());
vv4.insert(vv4.begin(), 5, 10);
vv4.insert(vv4.begin() + 4, num, num + 5);
vv4.push_back(300);
vv4.push_back(400);
vv4.push_back(500);
vv4.swap(vv1);//vv4和vv1的值交换
/* list<int>::iterator iter1;
iter1++;*/
//int* p = num;*p++
}
4、STL的应用(笔试题)
题目:
从标准输入读取n个整数,并将他们存储在一个动态分配的数组中,进行排序排完序后将结果输出。
(1)一般做题思路
思路:(三个步骤)
怎么读取?——动态分配数组——排序
①读取用scanf
while(1==sacnf("%d",&a));
int sacnf("",&);scanf的返回值是成功读取的个数,
scanf("%d%d%d",&a,&b,&c)//#if 0 //举例 int main() { int a, b, c; int n = scanf_s("%d%d%d", &a, &b, &c); cout << n << endl; } #endif
②动态分配数组
malloc、realloc(可以扩大到..,可以缩小到..)
void *realloc(void*,size)③sort排序
int num[];//是静态数组,无论括号里写多少都是错的。
gets()是读取字符串的
(2)用STL解决
//用STL解决问题
int main()
{
vector<int> vv;//vector是类模板,是容器
copy(istream_iterator<int>(cin),istream_iterator<int>(),
back_insert_iterator<vector<int>>(vv));
sort(vv.begin(), vv.end(), greater<int>());
copy(vv.begin(), vv.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
如有错误,敬请指正。
您的收藏与点赞都是对我最大的鼓励和支持!