手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

STL基础(一)

时间:2021/8/3 11:27:53|来源:|点击: 次

STL六大组件简介

STL 提供了六大组件,彼此之问可以组合套用,这六大组件分别是:容器、算法、达代器、仿函数,适配器(配接器)、空间配置器。

容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。

算法:各种常用的算法,如sort、find、copy、for_each,从实现的角度来看,STL算法是一种 function tempalte.

迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator*  operator->  operator++  operator--等指针相关操作予以重载的class template. 所有 STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。

仿函数:行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的 class 或者class templatev

适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。

空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.

STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。

STL优点

  • STL是C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
  • STL的一个重要特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作
  • 程序员可以不用思考STL 具体的实现过程,只要能够熟练使用STL 就 OK了。这样他们就可以把精力放在程序开发的别的方面。
  • STL具有高可重用性,高性能,高移植性,跨平台的优点。

高可重用性:STL中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。关于模板的知识,已经给大家介绍了。

高性能:如map可以高效地从十万条记录里面查找出指定的记录,因为map是采用红黑树的变体实现的。

高移植性:如在项目A上用STL编写的模块,可以直接移植到项目B上。

 STL三大组件

容器(序列式容器-按顺序存入、关联式容器-不按顺序存入)

算法(质变算法-拷贝、替换、删除  非质变算法-查找、计数、遍历)

迭代器(容器和算法的胶着剂)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void test01()
{
	int arr[] = {1,5,3,6,9};
	//int *p = arr;
	for (int i = 0;i<5;i++)
	{
		cout << arr[i] << endl;
		//cout << *(p++) << endl;
	}
}

void MyPrint(int v)
{
	cout << v << endl;
}

void test02()
{
	vector<int>v;
	v.push_back(1);
	v.push_back(5);
	v.push_back(3);
	v.push_back(6);
	v.push_back(0);

	//利用迭代器遍历容器 //遍历方式1
	vector<int>::iterator itBegin = v.begin();//itBegin指向的是v容器的起始位置
	vector<int>::iterator itEnd = v.end();//itEnd指向的是v容器的最后一个位置的下一个位置
	
	while (itBegin != itEnd)
	{
		cout << *itBegin << endl;
		itBegin++;
	}

	//遍历方式2
	for (vector<int>::iterator it = v.begin();it != v.end();it++)
	{
		cout << *it << endl;
	}

	//遍历方式3 利用算法
	for_each(v.begin(), v.end(), MyPrint);
	
}

int main()
{
	test02();
	return 0;
}

string常用操作

#include <iostream>
#include <string>
#include <stdexcept> //标准异常头文件
using namespace std;

/*
1、string构造函数
string()   //创建一个空字符串
string(const string& str)   //使用string对象初始化另一个string对象
string(const char*s)  //使用字符串s初始化
string(int n,char c)  //使用n个字符c初始化
*/

void test01()
{
	string str;
	string str2(str);
	string str3("abc");
	cout << str3;
	string str4(5,'c');
	cout << str4;
}

/*
2、string基本赋值操作
string& assign(const char* s,int n) //把字符串s的前n个字符赋值给当前的字符串
string& assign(const char* s,int start,int n) //将s从start开始n个字符赋值给当前的字符串
*/

void test02() 
{
	string str5 = "hello";
	string str6;
	str6.assign("abcde", 3);
	cout << str6 << endl;
	string str7;
	str7.assign(str5, 1, 3);
	cout << str7 << endl;
}

/*
3、string存取字符操作
*/
void test03()
{
	string s = "hello world";
	//访问
	for (int i = 0;i<s.size();i++)
	{
		//区别:[]访问越界会直接挂掉,at会抛出异常
		cout << s[i] << endl;
		cout << s.at(i) << endl;
	}

	try
	{ 
		//cout << s[10000] << endl;
		cout << s.at(1000) << endl;
	}
	catch (out_of_range &e)
	{
		cout << e.what() << endl;
	}
	catch (...)
	{
		cout << "越界异常" << endl;
	}
}

/*
4、string字符串的拼接、查找、替换、比较(compare)
*/
void test04()
{
	//拼接
	string s1 = "我";
	s1 += "爱北京";
	cout << s1 << endl;
	s1.append("天安门");
	cout << s1 << endl;
	//查找
	string s = "abcdef";
	int pos = s.find("bca");  //-1
	cout << pos << endl;

	int pos1 = s.rfind("ef");//4 按照原来索引
	cout << pos1 << endl;

	//替换
	string s3 = "hello";
	s3.replace(1, 3, "我爱北京");//从索引1开始3个字符替换为“我爱北京”
	cout << s3 << endl;

}

//5、子串、插入(insert)、删除(erase)
void test05()
{
	string s4 = "abcdeerwt";
	string s5 = s4.substr(1, 3);
	cout << s5 << endl;
}

//string和c-style字符串转换
void test06()
{
	string s = "abc";
	//string-->const char*
	const char* p = s.c_str();

	//const char* -->string
	string s2(p);
}

int main()
{
	test05();
	return 0;
}

小练习:写一个函数,函数肉部将string 字符串中的所有小写字母都变为大写字母。

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string str;
	while (getline(cin, str))
	{
		for (int i = 0;i<str.size();i++)
		{
			if (str[i]>='a'&&str[i]<='z')
			{
				//str[i] -= 32;
				//全变大写
				str[i] = toupper(str[i]);
				//全变小写
				str[i] = tolower(str[i]);
			}
		}
		cout << str << endl;
	}
	
	return 0;
}

Copyright © 2002-2019 某某自媒体运营 版权所有