2015-11-07 38 views
1

我正在做一個程序,使兩個二進制數的總和。一切正常,所有工作,但我需要一些提示如何更快的算法。C++如何更快的算法 - 使用字符串

我在考慮將所有變量改爲動態分配的變量。 這是個好主意嗎?使所有變量都變爲動態的,即使我只使用一個或唯一的長字符串?

我需要關於如何使用動態分配變量的建議。

這就是比如我檢查功能之一:

bool Correct(string v1, string v2){ 
for (unsigned int i = 0; i < v1.size(); ++i) { 
      if ((cin.fail())||((v1[i] != '1')&&(v1[i] != '0'))) 
       return false; 
       } 
for (unsigned int i = 0; i < v2.size(); ++i) { 
      if ((cin.fail())||((v2[i] != '1')&&(v2[i] != '0'))) 
       return false; 
       } 
    return true; 
} 

當我使用這個:

bool JsouVstupySpravne(string *v1, string *v2){...} 

所有使用像v1.size()停止工作。

+0

更多與你的問題有關的,只是說「停止工作」是沒有太大的繼續。 *它如何停止工作?如果你得到構建錯誤,那麼你應該在問題中包含完整和未編輯的構建日誌。如果發生崩潰,則使用調試器查找代碼中崩潰發生的位置。如果您得到意想不到的結果,請包括實際和預期結果。 –

+0

這段代碼並沒有總結任何內容 – wvdz

+1

爲什麼'cin.fail()'檢查?你什麼都不讀。如果您不修改字符串,請將它們作爲常量的引用(例如'const string&v1')。 –

回答

2

你可以給的輸入參數引用的一個開始:

bool Correct(string v1, string v2){ 

可以

bool Correct(const string &v1, const string &v2){ 
1

當使用指針的字符串,而不是你需要改變一個字符串

string1.size() → string1->size() 
string1[x] → (*string1)[x] 

因爲C++所需的語法不同。

但是,C++還允許您使用避免使副本仍然保持字符串對象語法的「引用」。要做到這一點你可以改變:

bool Correct(string v1, string v2){ ... } 

bool Correct(const string& v1, const string& v2){ ... } 

不過請注意,與今天的電腦執行速度取決於很多因素是「優化」的代碼,而不必首先固體措施僅僅是廢話。你首先需要找到時間花在何處(分析),然後只需投資於使代碼更快(有時不幸地使其更醜)。

+0

特別感謝! ;)現在我知道我需要的一切! – DoctorCZE

+2

@DoctorCZE:不......你不知道。你根本不知道你不知道。但你會後來知道:-) – 6502

1

如果您正在尋找關於性能優化的建議,則需要發佈負責大部分運行時的代碼。你沒有說你正在使用哪個操作系統,但應該有一個可用的分析器告訴你。在Linux上它是gprof,VC++包含一個。使用它來找出花費的時間,並優化熱點。

通過使用高效的算法,然後優化實施,通常可以獲得最佳性能收益。如何將位串轉換爲數字?我認爲這是一種有效的減少乘法運算的算法。

有兩點值得一提的代碼:

  1. 中的字符串每次複製的函數被調用,但他們不會被修改。使用const引用。
  2. 從片段猜測,你似乎使用std :: cin將0/1字符轉換爲數字。這可能不是很有效率,因爲iostreams可以做你可能不需要的東西,例如區域設置處理。

最後,還有一個std::bitset類型,它實現你想要做什麼,如果你可以用二進制串的固定長度和尺寸最大的生活。 64位。

unsigned long long Correct(const string &v1, const string &v2){ 
    auto const bits1 = std::bitset<64>(v1); 
    auto const bits2 = std::bitset<64>(v2); 

    return bits1.to_ullong() + bits2.to_ullong(); 
} 

boost::dynamic_bitset應該是一個替代方案,如果你需要更長的位串。

相關問題