2011-01-09 206 views
2

現在我有一個std :: strings數組,並且在我的字體中有一個函數來查找它有多寬。優化查找字符串數組中最寬的字符串?

for(std::vector<std::pair<std::string,bool>>::const_iterator it = items.begin(); 
    it != items.end(); ++it) 
{ 
    cSz = getFont().getTextWidth(it->first); 
    if(cSz > h) 
    { 
    h = cSz; 
    } 
} 
widestItem = h; 

我在想,如果我可能俯瞰更好的方式來做到這一點,因爲這是一個非常暴力的方式來找到它。

在我的情況下,沒有太多的意義在存儲每一個的寬度,並指出這一點。

感謝

回答

3

如果我是這個優化我最好:

  1. 請務必使用一個分析器來發現這就是顯著的時間是怎麼回事。

  2. 也許有一個(字體,字符串)元組緩存。如果您反覆計算相同字符串的寬度,這將有所幫助。但這取決於你的確切用例。

  3. 在常見情況下,您可以使getTextWidth方法變得非常快速 - 您可以擁有256個文本寬度單位的平面數組,並對每個拉丁字符進行取消引用和總結。這會很快,你不會看到現代CPU花費的時間。當然,你仍然需要實現非拉丁字符,並且你可能會也可能不想做字距,連字和複雜的文本佈局(這些東西會變得昂貴)。

2

如果字符串長度是重要的添加字符串到矢量時,你可以保存它的長度,這樣你就不需要每次都計算它(你可以使用一個std ::元組3項,而不是std :: pair,如果你有權訪問C++ 0x)。如果你經常更換字體,那麼這可能不合適。或者,如果矢量不包含數百萬個項目,則可以存儲長度並在更改字體時重新計算長度。

當我們沒有太多有關軟件結構的信息和除了這個小片段之外正在做的事情的情況下,優化很難。