栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

实验4 StL 应用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实验4 StL 应用

目录

一、撰写自己的算法和函数,结合容器和迭代器解决序列变换(如取反、平方、立方),像素变换(二值化、灰度拉伸)

1. 一般的函数方法

2. 模板函数

3. 结合容器和迭代器

3.1. 结合容器和迭代器解决序列变换

3.2. 结合容器和迭代器解决像素变换

3.3. 算法和函数之间的关系

二、用set存储学生信息,并进行增删改查操作

三、输入一个字符串,用map统计每个字符出现的次数并输出字符及对应的次数。


一、撰写自己的算法和函数,结合容器和迭代器解决序列变换(如取反、平方、立方),像素变换(二值化、灰度拉伸)

1. 一般的函数方法

首先是简单的取反和求平方的实现。

void transInv(int a[], int b[], int nNum)
{
	for (int i = 0; i < nNum; i++)
	{
		b[i] = -a[i];
	}
}
void transSqr(int a[], int b[], int nNum)
{
	for (int i = 0; i < nNum; i++)
	{
		b[i] = a[i] * a[i];
	}
}

输出的函数

template < typename T>
void outputCont(string strNme, ostream& os, T begin, T end)
{
	os << strNme << ":";
	for (; begin != end; begin++)
	{
		os << *begin << " ";
	}
	os << endl;
}

测试函数

void Test()
{
	const int N = 5;
	int a[N] = { 1,2,4,3,5 };
	outputCont("a", cout, a, a + N);
	int b[N];
	transInv(a, b, N);
	outputCont("Inv a", cout, b, b + N);
	transSqr(a, b, N);
	outputCont("Sqr a", cout, b, b + N);
}

运行结果如下,输出了三个结果,分别是数组a,对数组a取反存储在数组b输出,对数组a求平方存储在数组b输出。
 

a: 1 2 4 3 5
Inv a: -1 -2 -4 -3 -5
Sqr a: 1 4 16 9 25

D:studyc++experimentexperiment4Debugexperiment4.exe (进程 51980)已退出,代码为0。
按任意键关闭此窗口. . .

2. 模板函数

上述方法显然只能针对int类型,所以我们可以运用模板函数,针对不同 的数据类型,代码如下(只举例取反的模板函数,求平方等等同理):

template
void transInvT(T a[], T b[], int nNum)
{
	for (int i = 0; i < nNum; i++)
	{
		b[i] = -a[i];
	}
}

测试

    transInvT(a, b, N);
	outputCont("Inv a T", cout, b, b + N);

运行结果如下:

a: 1 2 4 3 5
Inv a: -1 -2 -4 -3 -5
Sqr a: 1 4 16 9 25
Inv a T:-1 -2 -4 -3 -5

D:studyc++experimentexperiment4Debugexperiment4.exe (进程 56620)已退出,代码为0。
按任意键关闭此窗口. . .

3. 结合容器和迭代器

3.1. 结合容器和迭代器解决序列变换

transInvT算法

template 
void transInvT(inputIter begInput, inputIter endInput,
			   outputIter begOutPut, MyOperator op)
{
	for (; begInput != endInput; begInput++, begOutPut++)
	{
		 //*begOutPut = ‐ (*begInput); 
		
		*begOutPut = op(*begInput); 
	}
}

测试函数

void Test()
{
	//TestMap();
	//TestSet();
	//TestVector();

	const int N = 5;
	int a[N] = { 1,2,4,3,5 };
	outputCont("a", cout, a, a + N);
	int b[N];
	vector vb(N);
	vector vc(N);
	transInv(a, b, N);
	outputCont("Inv a", cout, b, b + N);
	transSqr(a, b, N);
	outputCont("Sqr a", cout, b, b + N);
	transInvT(a, b, N);
	outputCont("Inv a T", cout, b, b + N);

	transInvT(a, a + N, b);
	transInvT(a, a + N, vb.begin());
	transInvT(a, a + N, b, InvT);
	transInvT(a, a + N, vb.begin(), InvT);
	outputCont("Inv a by iter", cout, vb.begin(), vb.end());
}

运行结果

a: 1 2 4 3 5
Inv a: -1 -2 -4 -3 -5
Sqr a: 1 4 16 9 25
Inv a T:-1 -2 -4 -3 -5
Inv a by iter: -1 -2 -4 -3 -5

3.2. 结合容器和迭代器解决像素变换
template
class MyThreshold {
public:
	MyThreshold(int n = 128) : _nThreshold(n)
	{

	}
	int operator()(T val)
	{
		return val < _nThreshold ? 0 : 1;
	}
	int _nThreshold;
};

测试函数

    transInvT(a, a + N, vb.begin(), MyThreshold(2));
	outputCont("Inv a by treshold", cout, vb.begin(), vb.end());

运行结果

a: 1 2 4 3 5
Inv a: -1 -2 -4 -3 -5
Sqr a: 1 4 16 9 25
Inv a T:-1 -2 -4 -3 -5
Inv a by iter: -1 -2 -4 -3 -5
Inv a by treshold: 0 1 1 1 1

3.3. 算法和函数之间的关系

mycomp排序方法

template < typename T>
bool mycomp(T a, T b)
{
	return a > b;
}

void Test()
{
	const int N = 5;
	int a[N] = { 1,2,4,3,5 };
	outputCont("a", cout, a, a + N);
	sort(a, a + N, mycomp);
	outputCont("a sorted", cout, a, a + N);
}

运行结果

a: 1 2 4 3 5
a sorted: 5 4 3 2 1

MyCompc():函数对象类MyCompc中的定义了调用操作符()

template < typename T>
class MyCompC
{
public:
	bool operator()(const T& x, const T& y) const
	{
		return	x > y;
	}
};
void Test()
{
	const int N = 5;
	int a[N] = { 1,2,4,3,5 };
	//输出a
	outputCont("a", cout, a, a + N);

	sort(a, a + N, MyCompC());
	outputCont("a sorted", cout, a, a + N);
}

运行结果

a: 1 2 4 3 5
a sorted: 5 4 3 2 1

二、用set存储学生信息,并进行增删改查操作

首先构建studentInfo类,其中有一个构造函数,学号和姓名两个变量,还有两个对运算符的重载,一个是为了输出,一个是为了比较学号的大小以便于排序。

class studentInfo {
public:
	studentInfo(string strNo, string strName) {
		_strNo = strNo;
		_strName = strName;
	}
	string _strNo; 
	string _strName;
	friend ostream& operator<<(ostream& os, const studentInfo& info)
	{
		os << info._strNo << " " << info._strName;
		return os;
	}
	friend bool operator<(const studentInfo& info1, const studentInfo& info2) {
		return info1._strNo < info2._strNo;

	}
};

接着用容器vector创建一个students对象,将学生信息存储在vector当中,再通过遍历vector将其存储在set当中。

void TestSet()
{
	vector students;
	students.push_back(studentInfo("10021", "Zhang san"));
	students.push_back(studentInfo("10002", "Li si"));
	students.push_back(studentInfo("10003", "Wang wu"));
	students.push_back(studentInfo("10011", "Wang Liu"));
	students.push_back(studentInfo("10010", "Wu Liu"));
	set studentSet(students.begin(), students.end());
	outputCont("student set", cout, studentSet.begin(), studentSet.end());
}

运行结果如下,由于集合的性质,集合本身的元素是有序的,我们可以看到学生信息已经按升序的方式进行了排序。
 

student set: 10002 Li si 10003 Wang wu 10010 Wu Liu 10011 Wang Liu 10021 Zhang san

增删改查

void TestSet()
{
	vector students;
	students.push_back(studentInfo("10021", "Zhang san"));
	students.push_back(studentInfo("10002", "Li si"));
	students.push_back(studentInfo("10003", "Wang wu"));
	students.push_back(studentInfo("10011", "Wang Liu"));
	students.push_back(studentInfo("10010", "Wu Liu"));
	set studentSet(students.begin(), students.end());
	outputCont("student set", cout, studentSet.begin(), studentSet.end());
	studentSet.insert(studentInfo("10000", "wjr"));
	outputCont("student set added", cout, studentSet.begin(), studentSet.end());
	studentSet.erase(studentInfo("10010", "WuLiu"));
	outputCont("student set erased", cout, studentSet.begin(), studentSet.end());
	
	//set::iterator it = studentSet.find(studentInfo("10010", "WuLiu"));
	if (studentSet.find(studentInfo("10010", "WuLiu")) != studentSet.end())
	{
		cout << "find it!" << endl;
	}
	else
	{
		cout << "not found!" << endl;
	}
}

运行结果

student set: 10002 Li si 10003 Wang wu 10010 Wu Liu 10011 Wang Liu 10021 Zhang san
student set added: 10000 wjr 10002 Li si 10003 Wang wu 10010 Wu Liu 10011 Wang Liu 10021 Zhang san
not found!

三、输入一个字符串,用map统计每个字符出现的次数并输出字符及对应的次数。

创建对象
map m;

map m; //op为排序规则,默认规则是less

void TestMap()
{
	map s;  
	char c;				
	do {
		cin >> c;
		if (isalpha(c))
		{
			c = tolower(c);
			s[c]++;
		}
	} while (c != '.');
		for (map::iterator iter = s.begin(); iter != s.end(); ++iter)
		cout << iter->first << "" << iter->second << " ";
	cout << endl;
}

运行结果如下,输出结果为key+value,即出现的字母即次数。

guhuitin
i1 u2 h1 t1 i2 g1

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/605290.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号