使用泛型算法的例子, 使用了函数对象

本文介绍了一个使用C++进行文本处理的应用案例,包括从文件读取数据、利用STL库进行排序、去重及过滤特定词汇等操作。通过具体代码展示了如何实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Test.txt中包含以下单词:

wo shi and if chen or xuefeng, how are you?

wo  or shi but chen but Xue but if and

 

test.cpp

// Patterns.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include "iostream"

#include "vector"

#include "algorithm"

#include "iterator"

#include "string"

#include "fstream"

using namespace std;

 

// 小于的函数对象

class LessThan

{

public:

      bool operator()(const string& s1, const string& s2)

      {

            return s1.size() < s2.size();

      }

};

 

// 负责输出的函数对象

class PrintItem

{

public:

      PrintItem(int lineLen = 8): m_cnt(0){}

      void operator()(const string& elem)

      {

            m_cnt++;

            cout << "Elem[" << m_cnt << "]:";

            cout << elem << endl;

      }

private:

      int m_cnt;

};

 

void Process(vector<string> &vec)

{

      cout << "/nInvoke some test algorithm.../n";

      // 调用sort排序

      cout << "sort()/n";

      sort(vec.begin(), vec.end());

      cout << "after sort:/n";

      for_each(vec.begin(), vec.end(), PrintItem());

 

      // 删除重复的

      cout << "/nunique and erase to remove the same elem/n";

      vector<string>::iterator it;

      // 返回的是需要删除的位置

      it = unique(vec.begin(), vec.end());

      vec.erase(it, vec.end());// 删除重复的

      cout << "/nAfter making sure the unique elem in vector:/n";

      for_each(vec.begin(), vec.end(), PrintItem());

 

      // 按照长度再排一次,如果长度相同,保留现有顺序, 使用函数对象

      cout << "/n stable_sort according to the length of word/n";

      stable_sort(vec.begin(), vec.end(), LessThan());

      for_each(vec.begin(), vec.end(), PrintItem());

 

      // 定义需要排除的单词

      static string rw[] = {"and", "if", "or", "but"};

      vector<string> remove_words(rw, rw+4);

 

      // 删除那些需要排除的词

      vector<string>::iterator it2 = remove_words.begin();

      for (; it2!=remove_words.end(); ++it2)

      {

            // 当前词在vector中的个数

            int cnt = 0;

            cnt = count(vec.begin(), vec.end(), *it2);

 

            cout << cnt << " instance removed:" << (*it2) << endl;

            // remove 以后,分成两部分,一部分是要保留的,另一半是要删除的,返回的就是要删除的开始位置

            vec.erase(remove(vec.begin(), vec.end(), *it2), vec.end());

 

            cout << "Current show:/n";

            for_each(vec.begin(), vec.end(), PrintItem());

      }

}

 

void main()

{

      vector<string> sample;

      string file1;

      cout << "Input file name:/n";

      cin >> file1;

 

      // 打开文件,作为输入流

      ifstream infile1(file1.c_str());

 

      // iterator的特殊形式

      istream_iterator<string> input_set1(infile1), eos;

      // 把文件中的单词添加到sample vector的末尾

      copy(input_set1, eos, back_inserter(sample));

 

      // 使用函数对象输出,也可以使用函数指针,但是函数指针就不能内联了,函数对象可以

      for_each(sample.begin(), sample.end(), PrintItem());

      cout << "/nWord number in txt: " << sample.size() << endl;

 

      Process(sample);

}

<think>嗯,用户问的是算法,这个我得先回忆一下相关知识。算法,通常是在编程中提到的概念,特别是在C++的STL或者Java的里。可能需要先解释什么是,再联系到算法上。 首先,(Generic)指的是在编程使用参数化,允许代码处理多种数据类而不需要为每个类都重写代码。比如,一个排序算法可以适用于整数、浮点数、字符串等不同类的数据,这就是的应用。 那算法应该就是利用技术实现的算法,能够独立于特定的数据类进行操作。例如,STL中的sort函数可以对各种容器进行排序,不管里面存的是int还是string。这样的算法提高了代码的复用性和灵活性。 不过用户可能想知道更具体的定义和例子,可能需要进一步解释算法的特点,比如它们如何通过迭代器访问数据,而不是直接操作具体的数据结构。这样算法和数据结构解耦,增强了通用性。 还要注意区分算法和普通函数模板的区别。算法通常指的是那些操作在容器上的算法,比如查找、排序、遍历等,而函数模板可能更广,任何使用模板的函数都可以算。 另外,可能需要提到算法的优势,比如类安全,减少代码重复,提高可维护性。同时,可能存在的缺点,比如编译时间增加,或者某些情况下性能上的考虑。 用户可能是刚开始学习编程,或者对概念不太清楚,所以需要用简单易懂的例子来说明。比如,举一个排序算法例子,说明如何用实现对不同数据类的排序。 还要确保回答结构清晰,分点解释,可能先定义,再特点,然后例子,最后优缺点。这样用户能一步步理解。 另外,用户要求用中文回答,所以要注意术语的准确翻译,比如“Generic Algorithm”翻译为“算法”是正确的。同时,检查是否有语法错误,确保LaTeX格式正确,比如提到算法时如果有数学表达式需要用$包裹。 可能还需要提到其他语言中的算法实现,比如Java中的方法,或者C#的集合类,但主要可能以C++的STL为例,因为STL中的算法非常典。 总结一下,回答的结构应该是: 1. 定义:算法是什么 2. 特点:类无关、使用迭代器、解耦数据结构和算法 3. 例子:如排序、查找 4. 优点:复用性、灵活性、类安全 5. 缺点:可能的编译和性能问题 6. 应用场景:需要处理多种数据类的场合 需要确保每个部分都简明扼要,用例子帮助理解。同时,检查是否有遗漏的关键点,比如模板元编程或者概念(C++20)对算法的影响,但可能用户不需要这么深入,保持基础解释即可。</think>### 什么是算法算法(Generic Algorithm)是编程中一种**数据类无关**的算法设计模式,其核心思想是通过**抽象化数据类**,使得同一套算法逻辑能够应用于多种不同的数据结构。这种设计模式在C++标准模板库(STL)、Java、C#等语言中被广使用。 --- #### 核心特点 1. **类无关性** 算法不依赖具体的数据类。例如,一个排序算法可以对整数数组、字符串列表或自定义对象进行排序,而无需为每种类单独实现。 ```cpp // C++ STL示例:排序 std::vector<int> nums = {3, 1, 4}; std::sort(nums.begin(), nums.end()); // 对int排序 std::vector<std::string> words = {"apple", "banana"}; std::sort(words.begin(), words.end()); // 对string排序 ``` 2. **基于迭代器操作** 算法通常通过**迭代器**(Iterator)访问数据,而非直接操作容器。这种设计解耦了算法数据结构,使得算法可以适配任何支持迭代器的容器(如数组、链表、树等)。 $$ \text{算法} \rightarrow \text{迭代器} \rightarrow \text{数据} $$ 3. **复用性灵活性** 通过模板(Template)或参数(如Java的`<T>`),算法逻辑只需编写一次,即可适配不同数据类,减少代码冗余。 --- #### 典例子 1. **查找算法** 如`std::find`,可以在任意容器中查找指定值: ```cpp auto it = std::find(vec.begin(), vec.end(), target); ``` 2. **排序算法** 如`std::sort`,支持对任何可比较元素排序(需定义`<`操作符)。 3. **变换算法** 如`std::transform`,将函数应用于容器中的每个元素: ```cpp std::transform(input.begin(), input.end(), output.begin(), [](int x) { return x * 2; }); ``` --- #### 优点局限性 - **优点** - **减少重复代码**:一套算法适配多种类。 - **类安全**:编译时检查类约束,避免运行时错误。 - **扩展性**:支持自定义类(需满足算法要求,如可比较)。 - **局限性** - **编译复杂性**:模板可能增加编译时间和代码体积。 - **概念约束**:若类不满足算法要求(如未定义比较操作),编译会报错。 --- #### 应用场景 1. 需要处理多种数据类的通用操作(如排序、搜索、遍历)。 2. 开发通用库或框架(如STL、Java集合框架)。 3. 提高代码的可维护性和扩展性。 --- ### 总结 算法的本质是**将算法逻辑数据类解耦**,通过模板或技术实现“一次编写,多处使用”。它体现了编程中“抽象化”和“复用性”的核心原则,是现代编程语言和库设计的基石之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值