while循環的每個迭代將創建和銷燬你的字符串tmp
對象。因此,第一步是將tmp
移到while循環之外,正如已經提到的那樣。這樣你就不必在每次迭代中構造一個新的字符串對象。但是,您仍然擁有tmp = line + s
分配,每次迭代都會導致內存重新分配。使用=運算符創建參數副本,並將副本分配給tmp字符串對象。因此,第二步是添加建議的mymap.insert(line+s, s);
,以消除對tmp
字符串對象的需求。
我想人們可以繼續這種改進,通過不分配"_a"
或"_b"
字符串s
每次迭代。這可以在while循環之外完成一次,然後根據a
和b
的內容,可以將不同的字符串對象添加到您的地圖。像這樣的東西(注:這是未經測試):
string a = "_a";
string b = "_b";
string line;
map<string, string> mymap;
while(getline(file, line) {
if(a) mymap.insert(line+a, a);
else if(b) mymap.insert(line+b, b);
}
有人可能會說,如果這是不錯的,在我看來juanchopanza的答案是不夠,因爲它保持代碼的可讀性。但是我認爲上面的代碼有更少的副本。
爲什麼不簡單地在while循環之外聲明字符串'tmp'?它將確保在每次迭代中只重複使用一個字符串副本。 –
「我們應該忘記小效率,大約97%的時間:不成熟的優化是所有邪惡的根源」 – rubenvb
rubenvb說的相反。像Knuth這樣的人都很好,他深刻理解他的代碼是如何工作的,而不關心這樣一個點的答案。但是,從一開始就忽略所有性能細節的人都會寫出糟糕的C++,並且不得不花費大量的時間來處理Knuth解決同樣的問題的問題,「忽略性能」,而且開始時速度足夠快。他還表示:「在已建立的工程學科中,容易獲得的12%的改進永遠不會被認爲是邊際的,我相信軟件工程中應該有相同的觀點。」 –