许多C++开源库(stl,opencv,ros和blas等)都使用了大量的泛型编程的思想,如果不理解这些思想,将很难看懂代码,而《泛型编程与STL》一书对理解泛型编程思想非常的有帮助,这里整理第二章的一些实现代码。

1.排序元素

#include <iostream>
#include <vector>
#include <algorithm>
#include <ostream>
#include <iterator>
using namespace std; int main(int argc, char** argv)
{
vector<string> V;
string tmp; while (getline(cin, tmp))
{
if (tmp == "")
break; // 回车结束
V.push_back(tmp);
}
// sort(V.begin(), V.end());// 升序
sort(V.begin(), V.end(), greater<string>()); // 降序
copy(V.begin(), V.end(), ostream_iterator<string>(cout, "\n"));
return ;
}

运行结果

输入:

排序输出:

2.查找元素

#include <string.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <ostream>
#include <iterator>
using namespace std; // 通常的查找方法,通过'\0'来结束查找
char* strchr(char *s, int c)
{
while (*s != '\0' && *s != c)
{
++s;
}
return *s == c ? s : (char*) ; // #define NULL (char*) 0
} // C 改进版本的查找方法,引入了range的概念[first, last),
// 通过比较指针first = last来结束查找
char* find1(char* first, char* last, int value)
{
while (first != last && *first != value)
++first;
return first;
} // C++ 模板方法查找,数据类型作为模板参数传入
template<class T>
T* find2(T* first, T* last, T value)
{
while (first != last && *first != value)
++first;
return first;
} // C++ 模板方法查找,访问器和数据类型都作为模板参数传入,
// 相较于find2,find具有更一般性。其很好地解决了以下问题:
// 1.审视元素;2.移动到下一个元素;3.检查是否已经处理完成所有元素;4.元素比较
template<class Iterator, class T>
Iterator find3(Iterator first, Iterator last, const T& value)
{
while (first != last && *first != value)
{
++first;
}
return first;
} // 链表查找
struct int_node
{
int value;
int_node* next;
}; // 链表无法满足 操作符的比较,因此通过一个外覆类实现++ == ->等操作符号的重载
template<class Node>
struct node_wrapper
{
Node* ptr;
node_wrapper(Node* p = )
: ptr(p)
{
}
// *
Node& operator *() const
{
return *ptr;
}
// 访问->
Node* operator ->() const
{
return ptr;
}
// 前置累加
node_wrapper operator++()
{
ptr = ptr->next; return *this;
}
// 后置累加
node_wrapper operator ++(int)
{
node_wrapper tmp = *this;
++*this;
return tmp;
}
// 相等判断
bool operator ==(const node_wrapper& i) const
{
return ptr == i.ptr;
}
// 非相等判断
bool operator !=(const node_wrapper& i) const
{
return ptr != i.ptr;
}
}; // template funtion, object function
template<class Node, class T>
bool operator !=(const Node& node, T value)
{
if (node.value != value)
return true;
return false;
} int main(int argc, char** argv)
{
char pat = 'x';
char str[] = "horsetail";
int str_size = strlen(str); cout << "****Task1: to find '" << pat << "' from \"" << str << "\"" << endl; // 通常的查找方法,通过'\0'来结束查找
cout << "----testing strchr----" << endl;
char* res = strchr(str, (int) pat); // to find
if (res != NULL)
cout << "found " << pat << endl;
else
cout << "not found " << pat << endl; // C 改进版本的查找方法,引入了range的概念[first, last),
// 通过比较指针first = last来结束查找
cout << "----testing find1----" << endl;
res = find1(str, str + str_size, (int) pat); // to find
if (res != str + str_size)
cout << "found " << pat << endl;
else
cout << "not found " << pat << endl; // C++ 模板方法查找,数据类型作为模板参数传入
cout << "----testing find2----" << endl;
res = find2(str, str + str_size, pat); // to find
if (res != str + str_size)
cout << "found " << pat << endl;
else
cout << "not found " << pat << endl; // C++ 模板方法查找,访问器和数据类型都作为模板参数传入,
// 相较于find2,find具有更一般性。其很好地解决了以下问题:
// 1.审视元素;2.移动到下一个元素;3.检查是否已经处理完成所有元素;4.元素比较
cout << "----testing find3----" << endl;
res = find3(str, str + str_size, pat); // to find
if (res != str + str_size)
cout << "found " << pat << endl;
else
cout << "not found " << pat << endl; // 链表查找,链表无法满足 操作符的比较,因此通过一个外覆类实现++ == ->等操作符号的重载
int value = ;
int link_size = ;
cout << endl;
cout << "****Task2: to find " << value << " from {0,1,2,3,...,10}" << endl;
cout << "----testing link int_node with find3----" << endl;
int_node* head_node = new int_node();
head_node->value = ;
head_node->next = ;
int_node* pnode = head_node;
for (int i = ; i < link_size; i++)
{// link contain {0,1,2,3,4,5,6,...}
int_node* node = new int_node();
node->value = i;
node->next = ; pnode->next = node;
pnode = node;
} node_wrapper<int_node> first(head_node);
node_wrapper<int_node> last();
node_wrapper<int_node> result = find3(first, last, value); // to find
if (result != last)
cout << "found " << value << endl;
else
cout << "not found " << value << endl; return ;
}

运行结果

****Task1: to find 'x' from "horsetail"
----testing strchr----
not found x
----testing find1----
not found x
----testing find2----
not found x
----testing find3----
not found x ****Task2: to find from {,,,,...,}
----testing link int_node with find3----
found

参考资料

[1].泛型编程与STL 侯捷 - 2003 - 中国电力出版社,第二章

C++泛型编程(2)--通过排序和查找元素理解迭代器的更多相关文章

  1. 类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。

      类 java.util.Collections 提供了对Set.List.Map进行排序.填充.查找元素的辅助方法. 1. void sort(List) //对List容器内的元素排序,排序的规 ...

  2. vector向量容器元素排序与查找

    1.利用标准库函数sort()对vector进行排序 参考源码: #include <algorithm> #include <vector> vector<int> ...

  3. Leetcode算法【34在排序数组中查找元素】

    在之前ARTS打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...

  4. Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...

  5. 【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)

    序数组中查找元素的起始位置):思路分享 <剑指offer>题目和LeetCode主站本质是一样的,想要找到target数目,也需要找到左右边界 题目解析: 在一个排序数组中,找到targe ...

  6. 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

    34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...

  7. 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...

  8. Golang的排序和查找

    Golang的排序和查找 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.排序的基本介绍 排序是将一组数据,依指定的顺序进行排列的过程.排序的分类如下 1>.内部排序 指将 ...

  9. C/C++中的排序和查找

    以下内容来自<C/C++程序设计实用案例教程> 1.排序 1.1使用qsort函数 C/C++库函数提供了快速排序函数qsort(q时quick的简写),需要引入头文件<stdlib ...

随机推荐

  1. spring上传文件

    在使用spring上传文件的时候,使用的文件接收参数类型为 org.springframework.web.multipart.MultipartFile 如果该参数没有指定@RequestParam ...

  2. OCM_第八天课程:Section4 —》数据管理

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  3. php 中使用include、require、include_once、require_once的区别

    在PHP中,我们经常会通过include.require.include_once.require_once来引用文件,都可以达到引用文件的目的,但他们之间又有哪些区别呢,接一下我们详细的介绍一下 i ...

  4. 性能测试十八:jmeter分布式

    一台压力机产生得压力是有限的,尤其是jmeter,java本来性能就不是很好,并发特别多的时候,jmeter的性能会急剧下降,正常的接口,若单台压力机,超过1000并发以后,jmeter的性能就不怎么 ...

  5. Java字符串的操作

    判断字符串是否存在 使用str.contains("values") public class one { /*判断某个字符串是否存在*/ public static void m ...

  6. C#--整型与字节数组byte[]之间的转换

    using System; int  i = 123;byte [] intBuff = BitConverter.GetBytes(i);     // 将 int 转换成字节数组lob.Write ...

  7. DOM树示意图

  8. hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误

    hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误 起因 ...

  9. 【C++ Primer 第13章】5. 动态内存管理类

    StrVec类的设计 [题目描述]:我们将实现标准库vector类的一个简化版本,我们所做的一个简化是不使用模板,我们类只用于string,因此,它被命名为StrVec. #include<io ...

  10. AOJ 0189 Convenient Location (Floyd)

    题意: 求某一个办公室 到其他所有办公室的 总距离最短  办公室数 不超过10 输入:多组输入,每组第一行为n (1 ≤ n ≤ 45),接下来n行是 (x, y, d),x到y的距离是d输出:办公室 ...