目录
一、撰写自己的算法和函数,结合容器和迭代器解决序列变换(如取反、平方、立方),像素变换(二值化、灰度拉伸)
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类型,所以我们可以运用模板函数,针对不同 的数据类型,代码如下(只举例取反的模板函数,求平方等等同理):
templatevoid 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算法
templatevoid 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
map
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



