【发布时间】:2010-10-23 23:55:44
【问题描述】:
这是我的算法的作用: 它需要一个长的 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 的过程中。奇怪的是,将其设为静态会导致更多的 CPU 消耗。在分析之后,我看到我进行了大量的堆分配,但我不知道为什么,因为即使在向量被清除后,std::vector 也应该保留它的项目。是否有一种不那么密集的方式来做到这一点?字符串长度是未知的,结果字符串的数量也是未知的,这就是我选择 std::vector 的原因,但是可能有更好的方法吗?
谢谢
*实际上我认为我的子字符串生成速度很慢
【问题讨论】:
-
分配是否可能是在副本中创建新的
string对象和substr()操作而不是直接负责向量push操作的结果?使用非静态向量真的会产生可衡量的差异吗? -
如果不能
reserve,试试穷人的不可变字符串:std::vector< boost::shared_ptr< std::string > > >。这避免了在调整向量大小时复制字符串,但代价是一些复杂性。一个真正的不可变字符串类将消除成本(或者就此而言,在 C++0x 中只是std::string,由于移动语义)。干杯&hth., -
另一个想法:如果你还没有打开优化。