2015-01-13 132 views
1
  • 我需要從輸入
  • 字符串具有2個字母的長度可達1000個字母
  • 我只需要讀一個字符串得到一個字符串的兩個第一和最後一個字符2個第一個字母,最後2個字母,整個字符串

這是我做這件事的方式的尺寸,但是,我相信這是一個更聰明的辦法,這就是爲什麼我問這個問題。您能否告訴我,沒有經驗的新C++程序員,更好地完成這項任務的可能方法是什麼?快速的方法來從輸入

謝謝。

string word; 
getline(cin, word); 

// results - I need only those 5 numbers: 
int l = word.length(); 
int c1 = word[0]; 
int c2 = word[1]; 
int c3 = word[l-2]; 
int c4 = word[l-1]; 

爲什麼我需要這個?我想編碼大量的真正長的字符串,但我發現我真的只需要我提到的5個值,其餘是多餘的。將加載多少個單詞?足以使這部分代碼值得處理:)

+1

你讀什麼樣的輸入?而且,你是否已經對這段代碼進行了剖析,以確切瞭解它花了多少時間?我不懷疑有更快的方法可以做到這一點,但我不知道他們能有多快,如果它會有所作爲。 –

+0

與Rodrigo一致,這個代碼塊需要多長時間才能執行每個單詞? – Steve

+0

感謝您的幫助!這是標準輸入,只是「從控制檯」加載的內容。在這部分代碼之後,我開始編寫數字(這是一張圖表,爲貝爾曼 - 福特做準備)。那麼,總是從輸入讀數太長,可能會更好:D – Randolph

回答

2

我會告訴你的話,這是值得優化到極致的東西。您在問題中顯示的方法已經是最直接的方法。

我會首先使用內存映射將文件塊一次映射到內存中。然後,遍歷緩衝區尋找換行符。取前一個換行符後面的前兩個字符和剛剛找到的那個前面的最後兩個字符。從第一個換行符中減去第一個換行符的地址以獲得該行的長度。沖洗,起泡並重復。

顯然需要注意一些邊界,其中一個換行符位於先前映射的緩衝區中,另一個位於下一個映射緩衝區中。

1

前兩個字母很容易獲得和快速。

問題在於最後兩個字母。

爲了讀取文本行,必須掃描輸入,直到找到行尾字符(通常是換行)。由於您的文本行是可變的,因此這裏沒有快速的解決方案。

您可以通過將文件中的數據塊讀入內存並搜索內存中的行尾來緩解此問題。這避免了對getline的調用,並且避免了對行尾的重複搜索(一次由getline和另一個由您的程序執行)。

如果更改要修復的輸入,則可以加快此問題的發生。

0

如果你想優化這個(雖然我無法想象你爲什麼想要這樣做,但你肯定有你的理由),首先要做的是擺脫std::string並直接讀取輸入。這會讓你省掉整個字符串的一個副本。

如果你的輸入是stdin,你也會因緩衝而減慢。正如已經說過的那樣,通過以二進制模式從文件中讀取大塊並自己完成行結束檢測,可以實現最佳速度。

無論如何,最終你將受到I/O帶寬(磁盤訪問速度)的限制。