Вот что делает мой алгоритм:
Он берет длинный std :: string и делит его на слова и подслову, если он больше ширины:
inline void extractWords(std::vector<std::string> &words, std::string &text,const AguiFont &font, int maxWidth)
{
words.clear();
int searchStart = 0;
int curSearchPos = 0;
char right;
for(size_t i = 0; i < text.length(); ++i)
{
curSearchPos = i;
//check if a space is to the right
if( i == text.length() - 1)
right = 'a';
else
right = text[i + 1];
//sub divide the string if it;s too big
int subStrWidth = 0;
int subStrLen = 0;
for(int x = searchStart; x < (curSearchPos - searchStart) + 1; ++x)
{
subStrWidth += font.getTextWidth(&text[x]);
subStrLen ++;
}
if(subStrLen > maxWidth && subStrLen > 1)
{
for(int k = 2; k <= subStrLen; ++k)
{
subStrWidth = 0;
for(int p = 0; p < k; ++p)
{
subStrWidth += font.getTextWidth(&text[searchStart + p]);
}
if(subStrWidth > maxWidth)
{
searchStart += k - 1;
words.push_back(text.substr(searchStart,k - 1));
break;
}
}
}
//add the word
if((text[i] == ' ' && right != ' ' ) || i == text.length() - 1)
{
if(searchStart > 0)
{
words.push_back(text.substr(searchStart ,(curSearchPos - searchStart) + 1));
}
else
{
words.push_back(text.substr(0 ,(curSearchPos - searchStart) ));
words.back() += text[curSearchPos];
}
searchStart = i + 1 ;
}
}
}
Как вы видите, я использую std :: vectors для добавления своих слов. Вектор дается ссылкой. Этот std :: vector является статическим и находится в процедуре, которая вызывает extractWord. Как ни странно, статичность привела к гораздо большему потреблению процессора. После профилирования я увидел, что я делаю много выделений кучи, но я не знаю почему, поскольку std :: vector должен сохранять свои элементы даже после очистки вектора. Есть ли менее интенсивный способ сделать это? Длина строки неизвестна, равно как и число результирующих строк, поэтому я выбрал std :: vector, но есть ли лучший способ?
Спасибо
* на самом деле я думаю, что моя генерация подстроки - это то, что медленно