前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

C++ STL之(容器算法迭代器)

qiguaw 2024-11-18 15:57:10 资源文章 19 ℃ 0 评论

前言:

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;
}


与人玫瑰,手有余香.小羊伴你一路同行~~~~~

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表