[vs2010 project] CppUnit快速入門

簡介

測試是軟件開發過程中極其重要的一環,詳盡周密的測試能夠減少軟件BUG,提高軟件品質。測試包括單元測試、系統測試等。其中單元測試是指針對軟件功能單元所作的測試,這里的功能單元可以是一個類的屬性或者方法,測試的目的是看這些基本單元是否工作正常。由于單元測試的內容很基礎,因此可以看作是測試工作的第一環,該項工作一般由開發人員自行完成。如果條件允許,單元測試代碼的開發應與程序代碼的開發同步進行。

雖然不同程序的單元測試代碼不盡相同,但測試代碼的框架卻非常相似,于是便出現了一些單元測試類庫,CppUnit便是其中之一。

CppUnit是XUnit中的一員,XUnit是一個大家族,還包括JUnit和PythonUnit等。CppUnit簡單實用,學習和使用起來都很方便,網上已有一些文章對其作介紹,但本文更著重于講解其中的基本概念和使用方法,以幫助初次接觸CppUnit的人員快速入門。

安裝

1、? 先下個最新版cppunit-1.12.1.tar.gz 解壓縮,進入cppunit-1.12.1\src目錄,就是源代碼所在,打開CppUnitLibraries.dsw工程,是用vc6.0寫的,用vs2010轉換到CppUnitLibraries.sln ok,

2、? 然后依次運行CppUnitLibraries.dsw工程下的每個項目,這樣做的目的是為了方面發現問題和找到正確的解決方法。下面是我在運行相應項目時所提示的錯誤以及解決辦法。未貼圖,把下述的解決辦法都做完即可,不需要查看貼圖的錯誤提示

1)???????運行項目Cppunit

解決辦法:

選擇Cppunit右鍵屬性 ->(debug)配置屬性->常規->目標文件名:$(ProjectName)修改成cppunitd(這樣做是為保持鏈接器->常規->目標文件名 一致);

2)???????運行項目cppunit_dll

?解決辦法:

??? 選擇Cppunit右鍵屬性->(debug)配置屬性->常規->目標文件名:$(ProjectName)修改成cppunitd_dll(這樣做是為保持庫管理器->常規->目標文件名 一致);

3)到這里這里會發現其實每個項目的錯誤基本上都是TargeName(xxx)LinkerOutputFile屬性值不匹配;依次修改項目DllPlugInTesterDSPlugInTestPlugInRunnerTestRunnerDebug配置屬性(每個后面都記得加個”d”,而且庫管理器中為:目標文件名.xxxx不需要修改,但庫管理器中的目標文件名可能要修改,該成與常規目標文件名一致!)

4)當然當修改完DSPlugIn的Debug配置屬性后再運行我們發現

???????????? 我們仔細觀察到底新的錯誤是什么呢? ??????????這里修改方式就是最上面的紅色字中提到的

修改TestRunnerUserInterface\DynamicWindow\MsDevCallerListCtrl.cpp文件第67行,改成:#import"libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("8.0")lcid("0") raw_interfaces_only named_guids

5)再次運行DSPlugIn項目我們會發現依然有錯誤

解決方法:

選擇項目->屬性->配置屬性->鏈接器->高級->無入口點 選擇"是(/NOENTRY)"

6)最后為了生成全面的庫文件我需要分別在Debug、release、Debug unicode、release unicode四種配置屬性中生成全部解決方案。(運行過程中會遇到錯誤基本上都可以從上文中找到解決方法)

7)編譯完成后,提示成功6 ?失敗 0 即安裝完畢

**************************************************************************************************
詳細說明:

解壓后,你可以看到CppUnit包含如下目錄:

    config:  配置文件contrib: contribution,其他人貢獻的外圍代碼doc:     文檔,需要通過doxygen工具生成,也可以直接從sourceforge站點上下載打包好的文檔examples:示例代碼include: 頭文件lib:     存放編譯好的庫src:     源文件,以及編譯庫的工程等

然后打開src目錄下的CppUnitLibraries工程,執行build/batch build,編譯成功的話,生成的庫文件將被拷貝到lib目錄下。

你也可以根據需要選擇所需的項目進行編譯,其中項目cppunit為靜態庫,cppunit_dll為動態庫,生成的庫文件為:

    cppunit.lib:     靜態庫release版cppunitd.lib:    靜態庫debug版cppunit_dll.lib: 動態庫release版cppunitd_dll.lib:動態庫debug版

要使用CppUnit,還得設置好頭文件和庫文件路徑,以VC6為例,選擇Tools/Options/Directories,在Include files和Library files中分別添加%CppUnitPath%/include和%CppUnitPath%/lib,其中%CppUnitPath%表示CppUnit所在路徑。

做好準備工作后,我們就可以編寫自己的單元測試代碼了。需說明的是,CppUnit所用的動態運行期庫均為多線程動態庫,因此你的單元測試程序也得使用相應設置,否則會發生沖突。

概念

在使用之前,我們有必要認識一下CppUnit中的主要類,當然你也可以先看后面的例子,遇到問題再回過頭來看這一節。

CppUnit核心內容主要包括六個方面,

1. 測試對象(Test,TestFixture,...):用于開發測試用例,以及對測試用例進行組織管理。

2. 測試結果(TestResult): ? ? ? ? ? ? ? ? 處理測試用例執行結果。TestResult與下面的TestListener采用的是觀察者模式(Observer Pattern)。

3. 測試結果監聽者(TestListener): ? TestListener作為TestResult的觀察者,擔任實際的結果處理角色。

4. 結果輸出(Outputter): ? ? ? ? ? ? ? ? ?將結果進行輸出,可以制定不同的輸出格式。

5. 對象工廠(TestFactory): ? ? ? ? ? ? ?用于創建測試對象,對測試用例進行自動化管理。

6. 測試執行體(TestRunner): ? ? ? ? ? 用于運行一個測試。

以上各模塊的主要類繼承結構如下:

         Test              TestFixture      TestResult          TestListener     _______|_________            |                                    |          |               |            |                           TestSuccessListenerTestComposite   TestLeaf         |                                    |          |               |____________|                           TestResultCollector          TestSuit                  |TestCase                     |TestCaller<Fixture>Outputter                                    TestFactory                    TestRunner____________________|_________________                            ||                   |                |                   TestFactoryRegistryCompilerOutputter  TextOutputter    XmlOutputter                      |TestSuiteFactory<TestCaseType>

接下來再對其中一些關鍵類作以介紹。

Test:所有測試對象的基類。

CppUnit采用樹形結構來組織管理測試對象(類似于目錄樹),因此這里采用了組合設計模式(Composite Pattern),Test的兩個直接子類TestLeaf和TestComposite分別表示“測試樹”中的葉節點和非葉節點,其中TestComposite主要起組織管理的作用,就像目錄樹中的文件夾,而TestLeaf才是最終具有執行能力的測試對象,就像目錄樹中的文件。

Test最重要的一個公共接口為:

virtual void run(TestResult *result) = 0;

其作用為執行測試對象,將結果提交給result。

在實際應用中,我們一般不會直接使用Test、TestComposite以及TestLeaf,除非我們要重新定制某些機制。

TestFixture:用于維護一組測試用例的上下文環境。

在實際應用中,我們經常會開發一組測試用例來對某個類的接口加以測試,而這些測試用例很可能具有相同的初始化和清理代碼。為此,CppUnit引入TestFixture來實現這一機制。

TestFixture具有以下兩個接口,分別用于處理測試環境的初始化與清理工作:

virtual void setUp(); ? ? ? ?//初始化
virtual void tearDown(); ?//清理

TestCase:測試用例,從名字上就可以看出來,它便是單元測試的執行對象。

TestCase從Test和TestFixture多繼承而來,通過把Test::run制定成模板函數(Template Method)而將兩個父類的操作融合在一起,run函數的偽定義如下:

// 偽代碼?
void?TestCase::run(TestResult*?result)
{
????result->startTest(this);?//?通知result測試開始
????if(?result->protect(this,?&TestCase::setUp)?)?//?調用setUp,初始化環境
????????result->protect(this,?&TestCase::runTest);?//?執行runTest,即真正的測試代碼
????result->protect(this,?&TestCase::tearDown);?//?調用tearDown,清理環境
????result->endTest(this);?//?通知result測試結束
}

這里要提到的是函數runTest,它是TestCase定義的一個接口,原型如下:

virtual void runTest();

用戶需從TestCase派生出子類并實現runTest以開發自己所需的測試用例。

另外還要提到的就是TestResult的protect方法,其作用是對執行函數(實際上是函數對象)的錯誤信息(包括斷言和異常等)進行捕獲,從而實現對測試結果的統計。

TestSuit:測試包,按照樹形結構管理測試用例

TestSuit是TestComposite的一個實現,它采用vector來管理子測試對象(Test),從而形成遞歸的樹形結構。

TestCaller:TestCase適配器(Adapter),它將成員函數轉換成測試用例

雖然我們可以從TestCase派生自己的測試類,但從TestCase類的定義可以看出,它只能支持一個測試用例,這對于測試代碼的組織和維護很不方便,尤其是那些有共同上下文環境的一組測試。為此,CppUnit提供了TestCaller以解決這個問題。

TestCaller是一個模板類,它以實現了TestFixture接口的類為模板參數,將目標類中某個符合runTest原型的測試方法適配成TestCase的子類。

在實際應用中,我們大多采用TestFixture和TestCaller相組合的方式,具體例子參見后文。

TestResult和TestListener:處理測試信息和結果

前面已經提到,TestResult和TestListener采用了觀察者模式,TestResult維護一個注冊表,用于管理向其登記過的TestListener,當TestResult收到測試對象(Test)的測試信息時,再一一分發給它所管轄的TestListener。這一設計有助于實現對同一測試的多種處理方式。

TestFactory:測試工廠

這是一個輔助類,通過借助一系列宏定義讓測試用例的組織管理變得自動化。參見后面的例子。

TestRunner:用于執行測試用例

TestRunner將待執行的測試對象管理起來,然后供用戶調用。其接口為:

virtual void addTest( Test *test ); virtual void run( TestResult &controller, const std::string &testPath = "" );

這也是一個輔助類,需注意的是,通過addTest添加到TestRunner中的測試對象必須是通過new動態創建的,用戶不能刪除這個對象,因為TestRunner將自行管理測試對象的生命期。

CppUnit在vs2010中配置:


參考:Vs2010下使用CppUint初體驗

http://blog.csdn.net/leer168/article/details/6708732


vs2010代碼實例:

CppUnitTest1

先讓我們看看一個簡單的例子:

#include?<cppunit/TestCase.h>
#include?<cppunit/TestResult.h>
#include?<cppunit/TestResultCollector.h>
#include?<cppunit/TextOutputter.h>

//?定義測試用例
class?SimpleTest?:?public?CppUnit::TestCase
{
public:
????void?runTest()?//?重載測試方法
????{
????????int?i?=?1;
????????CPPUNIT_ASSERT_EQUAL(0, i);
????}
};

int?main(int?argc,?char*?argv[])
{
????CppUnit::TestResult?r;?
????CppUnit::TestResultCollector?rc;
????r.addListener(&rc);?//?準備好結果收集器?

????SimpleTest?t;
????t.run(&r);?//?運行測試用例

????CppUnit::TextOutputter?o(&rc,?std::cout);
????o.write();?//?將結果輸出

????return?0;
}
編譯后運行,輸出結果為:
!!!FAILURES!!!
Test Results:
Run: 1 Failures: 1 Errors: 0

1) test: (F) line: 18 E:/CppUnitExamples/SimpleTest.cpp
equality assertion failed
- Expected: 1
- Actual : 0

上面的例子很簡單,需說明的是CPPUNIT_ASSERT_EQUAL宏。CppUnit定義了一組宏用于檢測錯誤,CPPUNIT_ASSERT_EQUAL是其中之一,當斷言失敗時,CppUnit便會將錯誤信息報告給TestResult。這些宏定義的說明如下:

CPPUNIT_ASSERT(condition):判斷condition的值是否為真,如果為假則生成錯誤信息。

CPPUNIT_ASSERT_MESSAGE(message, condition):與CPPUNIT_ASSERT類似,但結果為假時報告messsage信息。

CPPUNIT_FAIL(message):直接報告messsage錯誤信息。

CPPUNIT_ASSERT_EQUAL(expected, actual):判斷expected和actual的值是否相等,如果不等輸出錯誤信息。

CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual):與CPPUNIT_ASSERT_EQUAL類似,但斷言失敗時輸出message信息。

CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, delta):判斷expected與actual的偏差是否小于delta,用于浮點數比較。

CPPUNIT_ASSERT_THROW(expression, ExceptionType):判斷執行表達式expression后是否拋出ExceptionType異常。

CPPUNIT_ASSERT_NO_THROW(expression):斷言執行表達式expression后無異常拋出。


CppUnitTest2

接下來再看看TestFixture和TestCaller的組合使用:

#include?<cppunit/TestCase.h>
#include?<cppunit/TestResult.h>
#include?<cppunit/TestResultCollector.h>
#include?<cppunit/TextOutputter.h>
#include?<cppunit/TestCaller.h>
#include?<cppunit/TestRunner.h>

//?定義測試類
class?StringTest?:?public?CppUnit::TestFixture
{
public:
????void?setUp()?//?初始化
????{
????????m_str1?=?"Hello,?world";
????????m_str2?=?"Hi,?cppunit";
????}

????void?tearDown()?//?清理
????{
????}

????void?testSwap()?//?測試方法1
????{
????????std::string?str1?=?m_str1;
????????std::string?str2?=?m_str2;
????????m_str1.swap(m_str2);
????????
????????CPPUNIT_ASSERT(m_str1?==?str2);
????????CPPUNIT_ASSERT(m_str2?==?str1);
????}

????void?testFind()?//?測試方法2
????{
????????int?pos1?=?m_str1.find(',');
????????int?pos2?=?m_str2.rfind(',');

????????CPPUNIT_ASSERT_EQUAL(5, pos1);
????????CPPUNIT_ASSERT_EQUAL(2, pos2);
????}

protected:
????std::string?????m_str1;
????std::string?????m_str2;
};

int?main(int?argc,?char*?argv[])
{
????CppUnit::TestResult?r;?
????CppUnit::TestResultCollector?rc;
????r.addListener(&rc);?//?準備好結果收集器?

????CppUnit::TestRunner?runner;?//?定義執行實體
????runner.addTest(new?CppUnit::TestCaller<StringTest>("testSwap",?&StringTest::testSwap));?//?構建測試用例1
????runner.addTest(new?CppUnit::TestCaller<StringTest>("testFind",?&StringTest::testFind));?//?構建測試用例2
????runner.run(r);?//?運行測試

????CppUnit::TextOutputter?o(&rc,?std::cout);
????o.write();?//?將結果輸出

????return?rc.wasSuccessful()???0?:?-1;
}
編譯后運行結果為:
OK (2 tests)

CppUnitTest3

上面的代碼從功能上講沒有什么問題,但編寫起來太繁瑣了,為此,我們可以借助CppUnit定義的一套輔助宏,將測試用例的定義和注冊變得自動化。上面的代碼改造后如下:

#include?<cppunit/TestResult.h>
#include?<cppunit/TestResultCollector.h>
#include?<cppunit/TextOutputter.h>
#include?<cppunit/TestRunner.h>
#include?<cppunit/extensions/HelperMacros.h>


//?定義測試類
class?StringTest?:?public?CppUnit::TestFixture
{
????CPPUNIT_TEST_SUITE(StringTest);??//?定義測試包
????CPPUNIT_TEST(testSwap);??//?添加測試用例1
????CPPUNIT_TEST(testFind);??//?添加測試用例2
????CPPUNIT_TEST_SUITE_END();??//?結束測試包定義
????
public:
????void?setUp()?//?初始化
????{
????????m_str1?=?"Hello,?world";
????????m_str2?=?"Hi,?cppunit";
????}

????void?tearDown()?//?清理
????{
????}

????void?testSwap()?//?測試方法1
????{
????????std::string?str1?=?m_str1;
????????std::string?str2?=?m_str2;
????????m_str1.swap(m_str2);
????????
????????CPPUNIT_ASSERT(m_str1?==?str2);
????????CPPUNIT_ASSERT(m_str2?==?str1);
????}

????void?testFind()?//?測試方法2
????{
????????int?pos1?=?m_str1.find(',');
????????int?pos2?=?m_str2.rfind(',');

????????CPPUNIT_ASSERT_EQUAL(5, pos1);
????????CPPUNIT_ASSERT_EQUAL(2, pos2);
????}

protected:
????std::string?????m_str1;
????std::string?????m_str2;
};

CPPUNIT_TEST_SUITE_REGISTRATION(StringTest);?//?自動注冊測試包

int?main(int?argc,?char*?argv[])
{
????CppUnit::TestResult?r;?
????CppUnit::TestResultCollector?rc;
????r.addListener(&rc);?//?準備好結果收集器?

????CppUnit::TestRunner?runner;?//?定義執行實體
????runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
????runner.run(r);?//?運行測試

????CppUnit::TextOutputter?o(&rc,?std::cout);
????o.write();?//?將結果輸出

????return?rc.wasSuccessful()???0?:?-1;
}

CppUnit的簡單介紹就到此,相信你已經了解了其中的基本概念,也能夠開發單元測試代碼了。

其它CppUnit還包括其它一些輔助模塊,比如基于MFC的圖形化測試界面,下面這篇文章對此有所介紹:

???? CppUnit測試框架入門

?

CppUnit使用了很多設計模式,整體構架還算清晰合理,源碼也比較簡單易懂,這對于學習設計模式是一個不錯的選擇。網上已有這樣的一些資料:

???? CppUnit源碼解讀 ????? CppUnit代碼簡介 - 第一部分,核心類

(freefalcon于2006-05-22)

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

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

相關文章

[javascript|基本概念|Number]學習筆記

Number類型的值&#xff1a;整數/浮點數值 整數 十進制 e.g.: var intNum 50; 八進制 (嚴格模式下無效,解析錯誤)字面值首位必須是0,之后的數字序列為0&#xff5e;7 e.g.: var intNum 070; //解析為十進制56 (如果字面值數值超出了范圍&#xff0c;前導0將被忽略&#xf…

[轉]深入理解linux內核list_head

http://blog.chinaunix.net/uid-27122224-id-3277511.html 深入理解linux內核list_head的實現 2012-07-17 17:37:01 分類&#xff1a; LINUX 前言&#xff1a;在linux源代碼中有個頭文件為list.h。很多linux下的源代碼都會使用這個頭文件&#xff0c;它里面定義 了一個結構,以及…

xcode左側不顯示工程文件目錄,提示NO Filter Results

解決辦法&#xff1a; What solved was to go to Navigate > Reveal in Project Navigator . After this, the structure appeared again.

【VC++技術雜談005】如何與程控儀器通過GPIB接口進行通信

在工控測試系統中&#xff0c;經常需要使用到各類程控儀器&#xff0c;這些程控儀器通常具有GPIB、LAN、USB等硬件接口&#xff0c;計算機通過這些接口能夠與其通信&#xff0c;從而實現自動測量、數據采集、數據分析和數據處理等操作。本文主要介紹如何與程控儀器通過GPIB接口…

標題在上邊框中的html(fieldset標簽)

<fieldset> <legend>標題</legend> 內容 </fieldset> 轉載于:https://www.cnblogs.com/lswbk/p/4952820.html

移除項目中的CocoaPods

在項目中移除CocoaPods cocoaPods雖然很方便&#xff0c;但是我是真心的不喜歡用它&#xff0c;總是出錯如果你覺得CocoaPods讓你的項目出現了問題&#xff0c;不好用甚至是惡心&#xff0c;想將其從項目中徹底移除&#xff0c;也有方法&#xff1a; 1.刪除工程文件夾下的Podf…

ShellExecute使用詳解

有三個API函數可以運行可執行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因為使用復雜&#xff0c;比較少用。 2.WinExec主要運行EXE文件。如&#xff1a;WinExec(Notepad.exe Readme.txt, SW_SHOW); 3.ShellExecute不僅可以運行EXE文件&#xff0c;也可以運行…

javascript筆記整理(對象基礎)

一、名詞解釋 1.基于對象&#xff08;一切皆對象&#xff0c;以對象的概念來編程&#xff09; 2.面向對象編程(Object Oriented Programming&#xff0c;OOP) A.對象(JavaScript 中的所有事物都是對象) B.對象的屬性和行為 屬性:用數據值來描述他的狀態 行為:用來改變對象行為的…

java的安裝和配置

JRE (JAVA Runtime Enviroment java運行環境),包括JVM(java虛擬機)和java程序所需的核心功能類庫&#xff0c;如果只是運行java程序&#xff0c;只需安裝JRE。 JDK &#xff08;Java Development Kit 開發工具包&#xff09;包括開發JAVA程序時所需的工具&#xff0c;包括JRE…

#if, #ifdef, #ifndef, #else, #elif, #endif的用法

#ifdef的用法 靈活使用#ifdef指示符&#xff0c;我們可以區隔一些與特定頭文件、程序庫和其他文件版本有關的代碼。 代碼舉例&#xff1a;新建define.cpp文件 &#xff03;include "iostream.h" int main() { #ifdef DEBUG cout<< "Beginning ex…

redhat 6.6 安裝 (LVM)

http://www.cnblogs.com/kerrycode/p/4341960.html轉載于:https://www.cnblogs.com/zengkefu/p/4954955.html

MFC對話框最小化到托盤

1、在資源中的Icon中導入一個自己喜歡的圖標&#xff0c;ID命名為IDR_MAINFRAME&#xff0c;將先前的IDR_MAINFRAME的圖標刪除掉&#xff1b; 2、在自己的Dialog頭文件中定義一個變量 NOTIFYICONDATA m_nid&#xff0c;關于該結構體的具體信息可以查閱MSDN&#xff1b; 3、添加…

Android acache讀后感

今天了解到了一個android輕量級的開源緩存框架,(github&#xff1a;https://github.com/yangfuhai/ASimpleCache),花了一點時間研究了一下源代碼&#xff0c;大概的思路就是每個緩存目錄對應一個Acache類&#xff0c;通過mInstanceMap關聯&#xff08;個人覺得這個主要是減少對…

continue break

塊作用域 一個塊或復合語句是用一對花括號&#xff08;"{}"&#xff09;括起來的任意數量的簡單的java語句。塊定義了變量的作用范圍。 1、嵌套塊是方法內的嵌套&#xff0c;不包括類的花括號。在嵌套塊內的 變量是不可以重復定義的。 2、不允許重復定義的是局部變…

GetVersionEx 獲取系統版本信息

轉自&#xff1a;http://blog.csdn.net/yyingwei/article/details/8286658 最近在windows 8上獲取系統版本信息需要調用系統API&#xff0c;于是用到了GetVersionEx。 首先看一看函數原型&#xff1a; [cpp] view plaincopy BOOL GetVersionEx(POSVERSIONINFO pVersionInformat…

popoverController(iPad)

一、設置尺寸 提示&#xff1a;不建議&#xff0c;像下面這樣吧popover的寬度和高度寫死。 1 //1.新建一個內容控制器2 YYMenuViewController *menuVc[[YYMenuViewController alloc]init];3 4 //2.新建一個popoverController&#xff0c;并設置其內容控制器5 s…

靜態成員變量和非靜態成員變量的對比

靜態成員變量和非靜態成員變量的對比 1、存儲的數據 靜態成員變量存儲的是所有對象共享的數據 非靜態成員變量存儲的是每個對象特有的數據 2、存儲位置 靜態成員變量是隨著類的加載在方法區的靜態區開辟內存了 非靜態成員變量是隨著對象的創建再堆中開辟內存 3、調用方式 靜態成…

c++的thread類(c++線程簡單用法)

最近看了一個Thread類&#xff08;忘記在哪里看的了&#xff09;&#xff0c;感覺不錯。 創建線程時線程對應的函數必須是類的靜態成員&#xff0c;由于靜態成員無法訪問類的非靜態成員&#xff0c;我從前都是把對象的指針作為參數傳遞給線程函數來避免這個問題&#xff0c;但是…

[LeetCode]Merge Sorted Array

題目描述:(鏈接) Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:You may assume that nums1 has enough space (size that is greater or equal to m n) to hold additional elements from nums2. The number of eleme…

[LeetCode]Integer to Roman

題目描述:(鏈接&#xff09; Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 解題思路&#xff1a; 1 class Solution {2 public:3 string intToRoman(int num) {4 vector<int> values{1000…