网站首页 > 资源文章 正文
前言:
STL(standard template library,标准模板库),是惠普实验室开发的一系列软件的统称,现在主要出现在c++中,但在被引入c++技术之前就已经存在很长时间了.
STL从广义上讲分为三类:algtorithm(算法),container(容器)和iterator(迭代器),容器和算法可以通过迭代器进行无缝衔接,几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会.
使用STL的好处:
1)STL是c++的一部分,因此不需要额外安装什么,它被内建在你的编译器之内.
2)STL的一个重要特点就是数据结构和算法的分离,尽管这是个简单的概念,但是这种分离确实使得STL变得非常通用.
3)程序员可以不用考虑STL具体的实现过程,只要能够熟练地使用STL就好了,这样他们就可以把精力放在其他项目的开发上.
4)STL具有高可用性,高性能,高移植性,跨平台的优点
高可重用性:STL中几乎所有代码都采用了模板类和模板函数的方式实现,这相比传统的由函数组成的库来说提供了更好的代码重用机会(关于模板的知识前面已经介绍过了,如果需要的话可以翻阅之前的文章)
高性能:如map可以高效地从十万条记录里面查找出来指定的记录,因为map是用红黑树的变体实现的.(简单附图,如需要详细了解请自行查阅)
迭代器:
迭代器从作用上来说是最基本的部分,可是在理解起来比前者都要费力一些,软件设计有一个基本原则,所有的问题都可以通过引进一个中间层来简化,这种简化在迭代器中就是STL中用迭代器完成的,概括来说,迭代器在STL中将算法和容器联系起来.几乎在STL中算法都是通过迭代器存取元素序列进行工作的.
迭代器的基本原理
迭代器是一个可以遍历STL容器内全部或部分元素的对象
迭代器指出容器中一个特定的位置
迭代器就好像是一个指针
迭代器提供了体格容器对象的访问方法,并且可以定义了容器中对象的范围
算法:
数据库对数据类型的选择对其可重用性起着至关重要的作用.举例来说,一个求方根的函数,在使用浮点数作为其函数参数类型的情况下的可重用性肯定比使用整形作为它的参数类型要高.而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了很多有用的算法.它是在一个有效的框架中完成这些算法的-----可以将所有的类型划分为少数的几类,然后就可以在模板的参数中使用一种类型替换掉同一种.
容器:
序列式容器:每个元素都有固定的位置----取决于插入时机和地点,和元素值无关.
关联式容器:元素位置取决于特定的排序准则,和插入顺序无关.
容器算法迭代器简单实例代码
#include<iostream>
using namespace std;
#include"vector"
#include"algorithm"
class Teacher
{
public:
int age;
char name[64];
public:
void printT()
{
cout << "age:" << age << endl;
}
};
void main11()
{
vector<int> v1;//把你的元素拷贝到容器里面
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
//迭代器相当于一个指针
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << "";
}
//算法和迭代器可以进行无缝的链接
int num1=count(v1.begin(), v1.end(), 3);
cout << "num1:" << num1 << endl;
}
void main12()
{
Teacher t1, t2, t3;
t1.age = 31;
t1.age = 32;
t1.age = 33;
vector<Teacher*> v1;
v1.push_back(p1);
v1.push_back(p2);
v1.push_back(p3);
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << "";
}
}
void main13()
{
Teacher t1, t2, t3;
t1.age = 31;
t1.age = 32;
t1.age = 33;
Teacher *p1, *p2, *p3;
P1 = &t1;
P2= &t2;
P3 = &t3;
vector<Teacher*> v1;
v1.push_back(p1);
v1.push_back(p2);
v1.push_back(p3);
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout <<( *it)->age <<endl;
}
}
void main()
{
main11();
main12();
main13();
cout << "hello..." << endl;
system("pause");
return;
}
string的基本操作
#include<iostream>
using namespace std;
void main11()
{
//初始化方式
string s1 = "aaaa";
string s2("aaaa");
string s3 = s2;
string s4 (10, 'a');
cout << "s1:" << s1 << endl;
cout << "s2:" << s2 << endl;
cout << "s3:" << s3 << endl;
cout << "s4:" << s4 << endl;
}
//string 的遍历
void main22()
{
//1 数组方式
string s1 = "asddfff";
for (int i = 0; i < s1.length(); i++)
{
cout << a[i] << "";
}
//2 迭代器
for (string::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << "";
}
cout << endl;
for (int i = 0; i < s1.length(); i++)
{
cout << s1.at(i) << "";//抛出异常
}
cout << endl;
}
//字符指针和string 转换
void main33()
{
string s1 = "aaa";
printf("s1:%s\n", s1.c_str());
//s1的内容拷贝到buf中
char buf1[128];//分配内存
s1.copy(buf1, 3, 0);//只会拷贝三个字符,不会变成c风格的字符串
cout << "buf1:" << buf1 << endl;
}
//连接字符串
void main44()
{
string s1 = "aaa";
string s2 = "bbb";
s1 = s1 + s2;
cout << s1 << endl;
string s3 = "999";
string s4 = "4444";
s3.append(s4);
cout << "s3:" << s3 << endl;
}
//字符串的查找和替换
void main55()
{
string s1 = "sdf 555 sdgdf4564dfgtysrtw4tgrsghtyju7io869i7eu5ewtgrs";
int index = s1.find("555", 0);
cout << "index:" << index << endl;//位置下标,从0开始
int offindex = s1.find("555", 0);
while (offindex != string::npos)//出现的次数,数组下标
{
cout << "offindex" << offindex << endl;
offindex = offindex + 1;
s1.find("555", offindex);
}
//案例2 替换
string s3 = "aaa bbb ccc";
s3.replace(0, 3, "AAA");
cout << "s3" << s3 << endl;
offindex = s1.find("555", 0);
while (offindex != string::npos)//出现的次数,数组下标
{
cout << "offindex" << offindex << endl;
s1.replace(offindex, 3, "555");
offindex = offindex + 1;
s1.find("555", offindex);
}
cout << "s1替换后的结果:" << s1 << endl;
}
//区间删除和插入
void main66()
{
string s1 = "hello1 hello2 hello1";
string::iterator it = find(s1.begin(), s1.end(), '1');
if (it != s1.end())
{
s1.erase(it);
}
cout << "s1删除以后的结果" <<s1<< endl;
s1.erase(s1.begin(), s1.end());
cout << "s1全部删除:" << s1 << endl;
cout << "s1长度:" << s1.length() << endl;
}
void main77()
{
string s1 = "AAAbbb";
//函数的入口地址 函数对象 预定义的函数对象
transform(s1.begin(), s1.end(), s1.begin() ,tuopper);
cout << s1 << endl;
string s2 = "AAAbbb";
transform(s1.begin(), s1.end(), s2.begin(), tulower);
cout << "s2" << s2 << endl;
}
void main()
{
main11();
main22();
main33();
main44();
main55();
main66();
main77();
cout << "hello..." << endl;
system("pause");
return;
}
容器的部分基本操作
#include<iostream>
using namespace std;
#include "vector"
void main11()
{
vector<int> v1;
{
cout << "length:" << v1.size() << endl;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
cout << "length:" << v1.size() << endl;
//函数返回值当左值 应该返回一个引用
while (v1.size() > 0)
{
cout<<"尾部元素"<<v1.back();//获取尾部元素
v1.pop_back();//删除尾部元素
}
}
}
//vector初始化
void main22()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
vector<int> v2 = v1;
vector<int> v3(v1.begin(), v1.begin()+2);
}
//vector遍历
void main33()
{
vector<int> v1(10);//注意必须写10 ,要不就错了
for (int i = 0; i < 10; i++)
{
v1[i] = i + 1;
}
for (int i = 0; i < 10; i++)
{
printf("%d/n", v1[10]);
}
}
//当 it != v1.end说明这个容器已经遍历完毕了.end()的位置是最后一个元素的后面!!!!
//通过迭代器的方式遍历数组
void main44()
{
vector<int> v1(10);
for (int i = 0; i < 10; i++)
{
v1[i] = i + 1;
}
//通过迭代器的方式遍历数组
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)//当 it != v1.end说明这个容器已经遍历完毕了.end()的位置是最后一个元素的后面!!!!
{
cout << "*it" << "";
}
//逆序遍历
for (vector<int>::reverse_iterator rit = v1.rbegin; rit != v1.rend(); rit++)
{
cout << "*rit" << "";
}
}
void main55()
{
vector<int> v1(10);
for (int i = 0; i < 10; i++)
{
v1[i] = i + 1;
}
//区间删除
v1.erase(v1.begin(), v1.begin() + 3);
printV(v1);
//指定位置删除
v1.erase(v1.begin());
printV(v1);
v1[1] = 2;
v1[3] = 2;
printV(v1);
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)//当 it != v1.end说明这个容器已经遍历完毕了.end()的位置是最后一个元素的后面!!!!
{
if (*it == 2)
{
v1.erase(it);//会自动++,不用再写++了
//当删除的迭代器所指向元素的时候,erase删除函数会让it 自动下移
}
else
{
it++;
}
}
}
void main()
{
main11();
main22();
main33();
main44();
main55();
cout << "hello..." << endl;
system("pause");
return;
}
与人玫瑰,手有余香.小羊伴你一路同行~~~~~
猜你喜欢
- 2024-11-18 第03章-linux常用命令
- 2024-11-18 Python的文件处理
- 2024-11-18 Redash中文版配置MySQL数据源
- 2024-11-18 域名批量查询功能常用查询方法教程
- 2024-11-18 js中的正则表达式入门
- 2024-11-18 C++ string/stack/list/deque/multiset 小结
- 2024-11-18 微信小程序开发-自定义评论列表组件
- 2024-11-18 string 基本用法
- 2024-11-18 掼蛋技巧实战:保留变形木板!学会这个技巧打掼蛋所向披靡
- 2024-11-18 沈阳精品无抵消靓号 大厅过户
你 发表评论:
欢迎- 05-23如何制作含字母的流水条码
- 05-23NiceLabel又高出新境界,一分钟学会设计第一个标签
- 05-23商业设计中字体设计的创意方法
- 05-23条码软件如何调整条码数据的样式
- 05-23可变数据软件中条形码的制作步骤
- 05-23常用条形码类型组成及使用说明2
- 05-23条形码下面数据字号不一样大的UPC-A码怎么制作
- 05-23强烈推荐!这四款条形码生成工具超好用!
- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)