C++算法練習:單詞識別

? ? ? ? 做題記錄:牛客習題:單詞識別

? ? ? ? 相關題目代碼已經提交到gitee中:樓田莉子 (riko-lou-tian) - Gitee.com喜歡請點個贊謝謝

目錄

題目:

C++ 字符函數頭文件

頭文件:(C++ 標準庫)

核心函數功能說明:

getline函數

1.?std::getline?(來自?)

2.?istream::getline?(來自?)

仿函數

? ? ? ? 仿函數的使用

? ? ? ? 帶狀態的仿函數

? ? ? ? 多參數的仿函數

? ? ? ? 仿函數的實際應用舉例(自定義排序)


題目:

? ? ? ? 做題思路:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<vector>
#include<map>
#include<string>
#include<algorithm>
#include <cctype>  // 添加頭文件以使用 tolower 函數
using namespace std;
typedef pair<string, int> Word;
//仿函數
bool cmp(Word w1, Word w2)
{return w1.second > w2.second;
}
int main()
{map<string, int>mp;// 使用map存儲單詞及其出現次數string s;while (getline(cin, s)){// std::getline (來自 <string>)// 主要作用:從輸入流中讀取一行文本并存儲到 std::string 對象中for (int i = 0, j = 0; i < s.size(); i++){// 遇到分隔符(空格/句號)或字符串結尾時處理單詞if (s[i] == ' ' || s[i] == '.'){string t = s.substr(j, i - j);if (isupper(t[0]))//將單詞的首字母轉為小寫t[0] = tolower(t[0]);j = i + 1;//更新起始位置mp[t]++;//更新出現次數}}vector<Word>v(mp.begin(), mp.end());//將單詞和出現次數存入vectorsort(v.begin(), v.end(), cmp);//按出現次數從多到少排序for (int i = 0; i < v.size(); i++)//按字典序輸出單詞和出現次數cout << v[i].first << ":" << v[i].second << endl;}return 0;
}

? ? ? ? 擴充知識:

C++ 字符函數頭文件<cctype>

在 C++ 中,isupper?和?tolower?函數都來源于?<cctype>?頭文件(或 C 風格的?<ctype.h>)。以下是詳細說明:


頭文件:<cctype>(C++ 標準庫)

作用:提供字符分類和轉換函數,用于處理單字節字符(ASCII 字符集)

核心函數功能說明:
函數原型功能描述返回值
int isupper(int ch)檢測字符?ch?是否為大寫字母(A-Z)非零值(true)如果是;0(false)如果不是
int tolower(int ch)若?ch?是大寫字母,則返回對應小寫字母;否則返回原始值轉換后的字符(int 類型)
int islower(int ch)檢測字符?ch?是否為小寫字母(a-z)非零值(true)如果是;0(false)如果不是
int toupper(int ch)若?ch?是小寫字母,則返回對應大寫字母;否則返回原始值轉換后的字符(int 類型)
int isalpha(int ch)檢測字符?ch?是否為字母(A-Z 或 a-z)非零值如果是;0 如果不是
int isdigit(int ch)檢測字符?ch?是否為數字(0-9)非零值如果是;0 如果不是
int isalnum(int ch)檢測字符?ch?是否為字母或數字(等價于?isalpha?||?isdigit非零值如果是;0 如果不是
int isspace(int ch)檢測字符?ch?是否為空白字符(空格、制表符?\t、換行符?\n?等)非零值如果是;0 如果不是
int iscntrl(int ch)檢測字符?ch?是否為控制字符(ASCII 0-31 及 127)非零值如果是;0 如果不是
int ispunct(int ch)檢測字符?ch?是否為標點符號(非字母、數字、空白的可打印字符,如?!,?.非零值如果是;0 如果不是
int isprint(int ch)檢測字符?ch?是否為可打印字符(包括空格)非零值如果是;0 如果不是
int isgraph(int ch)檢測字符?ch?是否為圖形字符(可打印字符,不包括空格)非零值如果是
  1. 參數類型

    • 所有函數接受?int?類型參數(實際是字符的 ASCII 值)

    • 傳入的整數必須在?0~255?或?EOF(-1)范圍內

  2. 返回值

    • 分類函數(如?isupper)返回?非零值(通常為 1)表示真0 表示假

    • 轉換函數(如?tolower)返回轉換后的?ASCII 值(需顯式轉換回?char

getline函數

????????

在 C++ 中,getline?函數有兩個主要版本,分別來自不同的頭文件:

  1. std::getline?(用于?std::string)
    來源于:<string>?頭文件

  2. istream::getline?(用于 C 風格字符串)
    來源于:<iostream>?頭文件(作為?istream?類的成員函數)

1.?std::getline?(來自?<string>)

主要作用:從輸入流中讀取一行文本并存儲到?std::string?對象中

核心功能

  • 從輸入流讀取字符直到遇到分隔符(默認換行符)

  • 將讀取的內容存儲到?string?對象中(不包括分隔符)

  • 自動處理內存分配,無需擔心緩沖區大小

  • 分隔符會被從流中移除但不存儲

2.?istream::getline?(來自?<iostream>)

主要作用:從輸入流中讀取一行文本并存儲到 C 風格字符數組中

核心功能

  • 從輸入流讀取字符直到遇到分隔符或讀取了?count-1?個字符

  • 在讀取的字符串末尾添加空終止符?'\0'

  • 分隔符會被提取但不存儲到緩沖區

  • 需要預先分配足夠大的字符數組

特性std::getline?(來自?<string>)istream::getline?(來自?<iostream>)
目標類型std::stringC 風格字符數組
內存管理自動手動(需預分配緩沖區)
安全性高(無緩沖區溢出風險)低(可能緩沖區溢出)
最大長度無限制(僅受內存限制)受緩沖區大小限制
使用便捷性
推薦場景大多數現代 C++ 代碼遺留代碼或特定性能需求

getline?是 C++ 中處理文本輸入的核心函數:

  • <string>?版本:現代 C++ 首選,安全方便,配合?std::string?使用

  • <iostream>?版本:適用于 C 風格字符串或特定性能場景

  • 關鍵優勢:正確處理整行輸入,包括空格和特殊字符

  • 常見應用:文件處理、用戶輸入、數據解析

  • 注意要點:緩沖區管理、輸入流狀態處理、換行符處理

仿函數

? ? ? ? 本題中我們應用了仿函數,前面我們知道仿函數就是重載了運算符的類對象,類似于函數,因此叫仿函數

class FunctorName {
public:// 函數調用運算符重載return_type operator()(parameter_list) const; // 常成員函數版本return_type operator()(parameter_list);       // 非常成員函數版本
};

原型要素解析

組成部分說明
operator()必須重載的操作符
return_type仿函數的返回值類型
parameter_list參數列表(可為空)
const修飾符聲明為const成員函數,表示不修改對象狀態

? ? ? ? 仿函數的使用

? ? ? ? 基本使用:

#include <iostream>// 定義仿函數
class Square
{
public:int operator()(int x) const // const版本{ return x * x;}
};int main() 
{Square square;      // 創建仿函數對象int result = square(5); // 調用仿函數std::cout << "5 squared: " << result; // 輸出25return 0;
}

? ? ? ? 帶狀態的仿函數

class Accumulator 
{int total = 0; // 內部狀態
public:int operator()(int value) {total += value;return total;}void reset() { total = 0; }
};int main() 
{Accumulator acc;std::cout << acc(10) << "\n"; // 10std::cout << acc(20) << "\n"; // 30std::cout << acc(5) << "\n";  // 35acc.reset();std::cout << acc(100); // 100return 0;
}

? ? ? ? 多參數的仿函數

class RangeChecker 
{int min, max;
public:RangeChecker(int low, int high) : min(low), max(high) {}bool operator()(int value) const {return value >= min && value <= max;}
};int main() 
{RangeChecker inRange(10, 20);std::cout << "15 in range? " << inRange(15) << "\n"; // truestd::cout << "25 in range? " << inRange(25);        // falsereturn 0;
}

? ? ? ? 仿函數的實際應用舉例(自定義排序)

#include <algorithm>
#include <vector>// 按字符串長度排序
class LengthComparator 
{
public:bool operator()(const std::string& a, const std::string& b) const {return a.size() < b.size();}
};int main() 
{std::vector<std::string> words = { "apple", "banana", "kiwi", "orange" };// 使用仿函數排序std::sort(words.begin(), words.end(), LengthComparator());// 輸出:kiwi apple banana orangefor (const auto& word : words)std::cout << word << " ";return 0;
}

? ? ? ? 本篇內容就到這里了,喜歡請點個贊謝謝

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92580.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92580.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92580.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從免費到盈利:Coze智能體1小時封裝變現全流程指南——井云科技

在AI技術普惠的浪潮下&#xff0c;Coze等智能體平臺讓零代碼開發者也能快速構建功能強大的AI助手。然而&#xff0c;許多創作者在完成智能體開發后&#xff0c;卻面臨“工具免費、成本自擔”的困境——用戶無限制調用導致算力成本飆升&#xff0c;想收費又缺乏成熟的支付與用戶…

C++學習之STL學習:map/set

通過前面的學習&#xff0c;我們已經對C STL有了初步了解。然而&#xff0c;STL作為一個龐大復雜的體系&#xff0c;遠不止這些內容。接下來&#xff0c;我們將深入探討STL中的另外兩個重要組件——map和set。 作者的個人gitee&#xff1a;樓田莉子 (riko-lou-tian) - Gitee.co…

[學習] CORDIC算法詳解:從數學原理到反正切計算實戰

CORDIC算法詳解&#xff1a;從數學原理到反正切計算實戰 文章目錄CORDIC算法詳解&#xff1a;從數學原理到反正切計算實戰引言一、數學原理二、求解流程&#xff08;旋轉模式&#xff09;三、典型應用場景四、反正切計算示例&#xff08;Python實現&#xff09;五、算法流程可視…

3款強力的Windows系統軟件卸載工具

1、Geek 下載地址&#xff1a;https://download.csdn.net/download/weixin_42203093/91625765 Geek Uninstaller 是一款專業的 Windows 軟件卸載工具&#xff0c;主要用于卸載軟件并清理殘留垃圾&#xff1a; 特點 體積小巧便攜&#xff1a;軟件體積約為 1.7M&#xff0c;是單…

AcWing 4579. 相遇問題

這道題做個今天的結尾 比較簡單 正在備戰csp嗎&#xff0c;正好刷一下 難度&#xff1a;簡單時/空限制&#xff1a;1s / 256MB總通過數&#xff1a;1738總嘗試數&#xff1a;2584來源&#xff1a; CSP-J 2022 模擬賽 原題鏈接 4579. 相遇問題 - AcWing題庫 題目描述 一…

基于clodop和Chrome原生打印的標簽實現方法與性能對比

今天想看看&#xff0c;基于clodop和Chrome原生打印的標簽實現方法與性能對比。先看看DeepSeek關于這個問題的回答&#xff01; CloudPrint 和 Chrome 原生打印的區別 基本概念差異 CloudPrint (Clodop) 是基于云的打印服務解決方案需要安裝專門的客戶端程序支持跨平臺、跨設備…

百度網盤如何做到下載速度最快?OpenSpeedy綠色安裝版下載,開源免費網盤加速

下載地址獲取點擊這里打開&#xff1a;OpenSpeedy下載地址 打開解壓后的文件夾&#xff0c;找到【OpenSpeedy.exe】應用程序&#xff0c;右鍵選擇【以管理員身份運行】。 添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09; 主要特性&#xff1a; 免費開源蠻…

科技云報到:熱鏈路革命:阿卡 CRM 的 GTM 定位突圍

科技云報道原創。在企業數字化的工具箱里&#xff0c;“CRM” 一詞早已不是 “全流程客戶管理” 的代名詞&#xff0c;而是從營銷獲客到客戶信息沉淀&#xff0c;再到長期關系維護&#xff0c;仿佛要包攬從線索到復購的所有環節。但成立僅兩年半的阿卡 CRM&#xff0c;卻在實踐…

什么是Graphical Abstract

什么是Graphical Abstract 現在都需要用Graphical Abstract&#xff0c;新加的好像。圖形摘要&#xff08;Graphical Abstract&#xff09;是學術論文中一種以可視化方式濃縮呈現研究核心內容的圖表&#xff0c;它通過簡潔的圖形、流程圖、示意圖或組合視覺元素&#xff0c;直觀…

心靈筆記:正念冥想

定義&#xff1a;正念冥想&#xff08;Mindfulness Meditation&#xff09;是一種源自東方禪修、結合現代心理學的心理訓練方法&#xff0c;核心是有意識地將注意力集中在當下的體驗上&#xff0c;不加評判地覺察自身的 thoughts&#xff08;想法&#xff09;、feelings&#x…

微軟推出革命性AI安全工具Project IRE,重塑網絡安全防御新范式

面對日益復雜的網絡安全威脅&#xff0c;微軟近日發布了具有里程碑意義的Project IRE AI工具。這項創新性解決方案將人工智能與逆向工程技術深度融合&#xff0c;開創了自動化威脅檢測的新紀元。據微軟官方披露&#xff0c;該工具能夠在不依賴人工干預的情況下&#xff0c;自主…

C#Attribute(特性)的定義與使用

1.什么是 Attribute1.1 定義 Attribute 是一種“聲明式元數據&#xff08;declarative metadata&#xff09;”機制。 ? 附加位置&#xff1a;程序集、模塊、類型、字段、屬性、方法、方法參數、方法返回值、事件、泛型參數、局部變量、本地函數、Lambda 表達式、甚至表達式樹…

飛書對接E簽寶完整方案

1、概述飛書和E簽寶在各自領域都屬于領先的產品&#xff0c;但因為E簽寶與釘釘的特殊關系&#xff0c;一直以來E簽寶都只實現了與釘釘的深度集成&#xff0c;一家企業如果想同時使用飛書和E簽寶&#xff0c;則需要通過S-HUB這樣的產品來進行橋接&#xff0c;用戶在飛書端審批&a…

Mysql快速導出數據庫設計說明書word文檔(表結構、類型、注釋、是否有主鍵)

主要有三種方式&#xff0c;根據你的需求來選擇&#xff1a; 1、Mysql語句查詢 優點&#xff1a;無需安裝額外的軟件&#xff0c;使用你常用的數據庫可視化工具即可 缺點&#xff1a;受限于你的數據庫可視化工具的導出功能&#xff0c;需要額外寫腳本進行處理 2、Python腳本…

DigitalProductId解密算法php調試版piddebug.php

<?php // 使用數組字面量 $digits [B, C, D, F, G, H, J, K, M, P, Q, R,T, V, W, X, Y, 2, 3, 4, 6, 7, 8, 9]; //foreach ($digits as $digit) { // echo $digit."<br>"; //}$hexPidarray(0xc2,0x49,0x4b,0xcc,0x60,0x34,0x09,0xcd,0x96,0xf7,0xec,0…

IDEA快捷鍵壁紙分享

說明&#xff08;1&#xff09;因為顯示器的尺寸不同&#xff0c;對快捷鍵顯示的位置稍作調整 &#xff08;2&#xff09;這里默認您熟悉常用的快捷鍵&#xff0c;分享一些功能好用但是用的少的快捷鍵空壁紙筆記本壁紙&#xff08;15.6寸&#xff09;24 寸顯示器壁紙

InnoDB vs MyISAM: MySQL存儲引擎的世紀對決

選錯存儲引擎&#xff1f;你的數據庫性能可能暴跌80%&#xff01; 本文用最直觀的對比拆解MySQL兩大核心存儲引擎的差異&#xff0c;讓你徹底明白什么場景該選誰。一、引擎全景圖: 數據庫的"心臟"之爭 ?? #mermaid-svg-KTQko8kEUvOkTb4L {font-family:"trebuc…

【Avalonia】無開發者賬號使用iOS真機調試跨平臺應用

文章目錄1. 要求1.1 無需Apple開發者賬號1.2 最新版mac系統1.3 最新版Xcode2. 配對Mac3. 配置開發證書3.1 創建一個名為MTClient的Xcode項目3.2 找到簽名證書3.3 配置簽名3.4 配置標識符4. 真機調試4.1 設置應用首屏 Launch Screen4.2 設置應用圖標5. 問題5.1 DI異常該問題的解…

【LLM實戰|langchain】langchain基礎

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 【LLM實戰|langchain】langchain基礎 1. 模型 I/O 封裝 把不同的模型&#xff0c;統一封裝成一個接口&#xff0c;方便更換模型而不用重構代碼。 1.1 …

十九、MySQL-DQL-基本查詢

基本查詢代碼&#xff1a;DQL:基本查詢 1.查詢指定字段 name,entrydate 并返回 -- 1.查詢指定字段 name,entrydate 并返回 select name,entrydate from tb_emp;2.查詢返回所有字段 -- 2.查詢返回所有字段 -- 推薦 select id, username, password, name, gender, image, job, e…