C++編程面試復盤:數組降重+快排+函數指針+類模板

面試真題

真題1

#include <iostream>
// 在函數 find_repetnum 的參數列表中,int& length 中的 & 符號表示引用。通過將 length 聲明為引用,函數可以修改傳入的 length 變量的值,并且這種修改會在函數外部生效。
void find_repetnum(int* arr, int& length){int unique_index = 0;for (int i = 0; i < length - 1; i++) { // 修改循環條件if (arr[i] != arr[i + 1]) {arr[unique_index] = arr[i];unique_index++;}}arr[unique_index] = arr[length - 1]; // 處理最后一個元素length = unique_index + 1; // 更新數組長度
}int main(){int array[5] = { 1, 2, 2, 3, 4 };int length = 5;find_repetnum(array, length);for (int i = 0; i < length; i++) {std::cout << "Output Deal Data: " << array[i] << std::endl;}return 0;
}

真題2

第一步:實現快速排序

#include <iostream>
using namespace std;void quickSort(int arr[], int left, int right) {if (left < right) {int pivot = arr[(left + right) / 2];int i = left, j = right;while (i <= j) {while (arr[i] < pivot)i++;while (arr[j] > pivot)j--;if (i <= j) {swap(arr[i], arr[j]);i++;j--;}}quickSort(arr, left, j);quickSort(arr, i, right);}}int main() {int arr[] = { 5, 2, 9, 1, 7, 6, 3 };int n = sizeof(arr) / sizeof(arr[0]);quickSort(arr, 0, n - 1);for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;return 0;
}

第二步:將比較部分單獨封裝,并作為函數指針傳遞給快速排序算法

#include <iostream>
using namespace std;bool compare_value(int num1, int num2) {if (num1 < num2)return true;elsereturn false;
}void quickSort(int arr[], int left, int right, bool (*ptr)(int, int)) {if (left < right) {int pivot = arr[(left + right) / 2];int i = left, j = right;while (i <= j) {while (ptr(arr[i], pivot))i++;while (ptr(pivot, arr[j]))j--;if (i <= j) {swap(arr[i], arr[j]);i++;j--;}}quickSort(arr, left, j, ptr);quickSort(arr, i, right, ptr);}}int main() {int arr[] = { 5, 2, 9, 1, 7, 6, 3 };int n = sizeof(arr) / sizeof(arr[0]);quickSort(arr, 0, n - 1, compare_value);for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;return 0;
}

第三步:將第二步中的代碼,封裝成類模板

#include <iostream>
using namespace std;template <typename T>
class QuickSort {
public:bool compare_value(T num1, T num2) {if (num1 < num2)return true;elsereturn false;}void quickSort(T arr[], int left, int right, bool (*ptr)(T, T)) {if (left < right) {T pivot = arr[(left + right) / 2];int i = left, j = right;while (i <= j) {while (ptr(arr[i], pivot))i++;while (ptr(pivot, arr[j]))j--;if (i <= j) {swap(arr[i], arr[j]);i++;j--;}}quickSort(arr, left, j, ptr);quickSort(arr, i, right, ptr);}}
};int main() {int arr[] = { 5, 2, 9, 1, 7, 6, 3 };int n = sizeof(arr) / sizeof(arr[0]);QuickSort<int> qs;qs.quickSort(arr, 0, n - 1, qs.compare_value);for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;return 0;
}

注意:在類模板的sort函數中,需要將類模板的成員函數進行遞歸調用。因為sort函數是類模板QuickSort的成員函數,所以遞歸調用應該使用this->sort(arr, left, j);和this->sort(arr, i, right);。

知識點1:類模板

為什么需要類模板?

類模板與函數模板的定義和使用類似,有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同

類模板定義

類模板由模板說明和類說明構成模板說明同函數模板,如下:?    template  <類型形式參數表>
?     類聲明
template  <typename Type>class ClassName{
public://ClassName 的成員函數
private:Type DataMember;}

單個類模板的使用

#include <iostream>
using namespace std;template<typename T>
class A
{public:// 函數的參數列表使用虛擬類型A(T t = 0){this->t = t;}// 成員函數返回值使用虛擬類型T& getT(){return t;}private:// 成員變量使用虛擬類型T t;
};void printA(A<int>& a){cout << a.getT() <<endl;
}int main(void){// 1、模板類定義類對象,必須顯示指定類型// 2、模板中如果使用了構造函數,則遵守以前的類的構造函數的調用規則A<int> a(666);cout << a.getT()<<endl;// 模板類做為函數參數printA(a);system("pause");return 0;
}

繼承中類模板的使用

父類是一般類,子類是模板類

class A{public:A(int temp =0){this->temp = temp;}~A(){}private:int temp;
};template <typename T>
class B :public A{public:B(T t = 0):A(666){this->t = t;}~B(){}private:T t;
};

子類是一般類,父類是模板類

template <typename T>
class A{public:A(T t = 0){this->t = t;}~A(){}private:T t;
};class B:public A<int>{public://也可以不顯示指定,直接A(666)B(int temp = 0):A<int>(666){this->temp = temp;}~B(){}private:int temp;
};

父類和子類都是模板類

父類和子類都是模板類時,子類的虛擬的類型可以傳遞到父類中。

結論

子類從模板類繼承的時候,需要讓編譯器知道父類的數據類型具體是什么

1.父類一般類,子類是模板類, 和普通繼承的玩法類似

2.子類是一般類,父類是模板類,繼承時必須在子類里實例化父類的類型參數

3.父類和子類都時模板類時,子類的虛擬的類型可以傳遞到父類中

類模板 template 和 template區別

template 用于基礎數據類型, T可以是int char 等
template 用于復制數據類型,T :string ,類等

知識點2:c++中什么時候需要使用this

在 C++ 中,關鍵字 this 是一個指向當前對象的指針,它在類的成員函數中使用
一般情況下,你需要使用 this 指針來區分類的成員變量與局部變量或參數同名的情況
以下是一些常見情況下需要使用 this 指針的情況:
1、區分成員變量和局部變量:當成員變量與局部變量同名時,使用 this-> 來引用成員變量,以區分兩者。

class MyClass {
public:int a;void setA(int a) {this->a = a; // 使用 this 指針來訪問成員變量 a}
};

2、在成員函數中返回對象本身:有時候在類的成員函數中需要返回對象本身,這時可以使用 return *this; 來返回當前對象。

class MyClass {
public:MyClass& doSomething() {// 進行操作return *this; // 返回當前對象}
};

3、在類內部調用其他成員函數:在類的成員函數中調用其他成員函數時,可以使用 this-> 來顯式調用。

class MyClass {
public:void func1() {// 一些操作}void func2() {this->func1(); // 顯式調用 func1}
};

總的來說,使用 this 指針可以幫助在類的成員函數中準確地引用成員變量、返回對象本身或者在類內部進行成員函數的調用。

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

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

相關文章

Vue2:路由history模式的項目部署后頁面刷新404問題處理

一、問題描述 我們把Vue項目的路由模式&#xff0c;設置成history 然后&#xff0c;build 并把dist中的代碼部署到nodeexpress服務中 訪問頁面后&#xff0c;刷新頁面報404問題 二、原因分析 server.js文件 會發現&#xff0c;文件中配置的路徑沒有Vue項目中對應的路徑 所以…

React withRouter的使用及源碼實現

一 基本介紹 作用&#xff1a; 把不是通過路由切換過來的組件中&#xff0c;將react-router 的 history、location、match 三個對象傳入props對象上。比如首頁&#xff01; 默認情況下必須是經過路由匹配渲染的組件才存在this.props&#xff0c;才擁有路由參數&#xff0c;才能…

嵌入式學習筆記Day27

今天主要學習了進程間的通信&#xff0c;主要學習了通過管道進行通信 一、進程間的通信 進程間的通信方式有以下幾種&#xff1a; 1.管道 2.信號 3.消息隊列 4.共享內存 5.信號燈 6.套接字二、管道 2.1無名管道 無名管道只能用于具有親緣關系的進程間通信 函數接口&#x…

Nacos進階

目錄 Nacos支持三種配置加載方案 Namespace方案 DataID方案 Group方案 同時加載多個配置集 Nacos支持三種配置加載方案 Nacos支持“Namespacegroupdata ID”的配置解決方案。 詳情見&#xff1a;Nacos config alibaba/spring-cloud-alibaba Wiki GitHub Namespace方案…

《TCP/IP詳解 卷一》第12章 TCP初步介紹

目錄 12.1 引言 12.1.1 ARQ和重傳 12.1.2 滑動窗口 12.1.3 變量窗口&#xff1a;流量控制和擁塞控制 12.1.4 設置重傳的超時值 12.2 TCP的引入 12.2.1 TCP服務模型 12.2.2 TCP可靠性 12.3 TCP頭部和封裝 12.4 總結 12.1 引言 關于TCP詳細內容&#xff0c;原書有5個章…

【C++ map和set】

文章目錄 map和set序列式容器和關聯式容器鍵值對setset的主要操作 mapmap主要操作 multiset和multimap map和set 序列式容器和關聯式容器 之前我們接觸的vector,list,deque等&#xff0c;這些容器統稱為序列式容器&#xff0c;其底層為線性序列的的數據結構&#xff0c;里面存…

【LV14 day4 字符設備驅動基礎框架】

一、字符設備驅動框架解析 設備的操作函數如果比喻是樁的話&#xff08;性質類似于設備操作函數的函數&#xff0c;在一些場合被稱為樁函數&#xff09;&#xff0c;則&#xff1a; 驅動實現設備操作函數 ----------- 做樁 insmod調用的init函數主要作用 --------- 釘樁 rm…

都說了能不動就別動,非要去調整,出生產事故了吧

MyBatis 替換成 MyBatis-Plus 背景介紹 一個老項目&#xff0c;數據庫用的是 MySQL 5.7.36 &#xff0c; ORM 框架用的 MyBatis 3.5.0 &#xff0c; mysql-connector-java 版本是 5.1.26 新來了一個干練的小伙&#xff0c;精力充沛&#xff0c;看著就是一個喜歡折騰的主 他…

leetcode 3.1

leetcode hot 100 雙指針1.三數之和2.接雨水 多維動態規劃1.最長公共子序列 雙指針 1.三數之和 三數之和 排序 雙指針的方法&#xff0c;固定一個數nums[i], 用兩數和找target - nums[i] 的數需要注意兩點: 1.需要去掉重復數字 while (l < r && nums[l] nums[…

社交APP開發能給用戶帶來什么

現在的社交軟件也非常的多&#xff0c;每款社交軟件都有自己的特色&#xff0c;社交軟件是日常中必備的軟件&#xff0c;不管是生活交流還是感情工作交流都是比較方便的&#xff0c;因為社交軟件滿足了日常的遠程交流問題&#xff0c;所以開發社交軟件也會逐漸的流行起來的。 …

Error: T doesn‘t have .length

Error: T doesn‘t have .length 在 TypeScript 中&#xff0c;當我們使用泛型 <T> 時&#xff0c;有時會遇到一個常見問題&#xff1a;編譯器提示錯誤&#xff0c;指出泛型類型 T 不具備 .length 屬性。在本文中&#xff0c;我們將探討這個問題的解決方案&#xff0c;并…

【Qt學習】QLCDNumber的介紹與實例使用(倒計時功能)

文章目錄 1. 介紹2. 實例 - QLCDNumber倒計時3. 資源文件 1. 介紹 QLCDNumber是Qt框架中用于顯示數字的控件&#xff0c;它模擬了一個液晶數字顯示屏。 在Designer界面中顯示如下&#xff1a; 有以下 常用屬性&#xff1a; 屬性描述intValue獲取或設置QLCDNumber顯示的整數…

Redis高級特性詳解:事務處理、發布訂閱、持久化和集群

Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的基于內存的數據結構存儲系統&#xff0c;被廣泛應用于緩存、隊列、計數器等場景中。除了基本的鍵值存儲功能外&#xff0c;Redis還提供了許多高級特性&#xff0c;包括事務處理、發布訂閱、持久化和集群。在…

js截取圖片地址后面的參數和在路徑中截取文件名或后綴名

文章目錄 前言截取地址 &#xff1f;后面的參數在路徑中截取文件名或后綴名總結 前言 在處理網頁上的圖片資源或者其他類型的文件資源時&#xff0c;你可能會遇到需要使用這些技巧的情況。以下是一些具體的使用場景&#xff1a; 動態修改圖片參數&#xff1a;如果你有一個圖片U…

【BBuf的CUDA筆記】十四,OpenAI Triton入門筆記三 FusedAttention

0x0. 前言 繼續Triton的學習&#xff0c;這次來到 https://triton-lang.org/main/getting-started/tutorials/06-fused-attention.html 教程。也就是如何使用Triton來實現FlashAttention V2。對于FlashAttention和FlashAttention V2網上已經有非常多的介紹了&#xff0c;大家如…

Win11系統安裝安卓子系統教程

隨著Win11系統的不斷普及&#xff0c;以及硬件設備的更新換代&#xff0c;我相信很多同學都已經更新并使用到了最新的Win11系統。那么&#xff0c;Win11系統最受期待的功能“Windows Subsystem for Android”&#xff08;簡稱WSA&#xff09;&#xff0c;即《安卓子系統》。他可…

spring.factories的常用配置項

概述 spring.factories 實現是依賴 spring-core 包里的 SpringFactoriesLoader 類&#xff0c;這個類實現了檢索 META-INF/spring.factories 文件&#xff0c;并獲取指定接口的配置的功能。 Spring Factories機制提供了一種解耦容器注入的方式&#xff0c;幫助外部包&am…

掘根寶典之C語言字符串輸入函數(gets(),fgets(),get_s())

字符串輸入前的注意事項 如果想把一個字符串讀入程序&#xff0c;首先必須預留該字符串的空間&#xff0c;然后用輸入函數獲取該字符串 這意味著必須要為字符串分配足夠的空間。 不要指望計算機在讀取字符串時順便計算它的長度&#xff0c;然后再分配空間(計算機不會這樣做&a…

ai圖生文的軟件!分享4個受歡迎的!

在數字化時代&#xff0c;隨著人工智能技術的飛速發展&#xff0c;AI圖生文軟件已經成為自媒體人、創作者和廣告從業者手中的得力助手。這些軟件能夠將靜態的圖片轉化為生動的文字&#xff0c;為圖片注入靈魂&#xff0c;讓觀者仿佛置身于畫面之中。今天&#xff0c;就讓我們一…

LabVIEW和Python開發微細車削控制系統

LabVIEW和Python開發微細車削控制系統 為滿足現代精密加工的需求&#xff0c;開發了一套基于LabVIEW和Python的微細車削控制系統。該系統通過模塊化設計&#xff0c;實現了高精度的加工控制和G代碼的自動生成&#xff0c;有效提高了微細車削加工的自動化水平和編程效率。 項目…