c++ - std::vector push_back 是瓶颈

标签 c++ vector

这是我的算法的作用: 它需要一个长的 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 即使在 vector 被清除后也应该保留其项目。是否有一种不太密集的方式来做到这一点?字符串长度未知,结果字符串的数量也未知,这就是我选择 std::vector 的原因,但是是否有更好的方法?

谢谢

*实际上我认为我的子串生成很慢

最佳答案

通常,如果向 vector 添加元素是一个瓶颈,您应该使用 std::vector<T>::reserve提前预留一些空间。这应该会降低调用 push_back 的可能性。将触发内存重新分配。

也就是说,字符串处理通常会非常占用 CPU,重新分配字符串对象的 vector 需要很多复制。每次 vector 重新分配内存时,每个字符串对象都需要复制到内存中的另一个位置。 (幸运的是,一旦 C++0x 移动构造函数到位,这将大大缓解。)

此外,您每次都清除 vector 这一事实并不会改变每次调用 push_back 的事实。结果将字符串对象复制到 vector 中,这可能是您看到的所有堆分配的原因。不要忘记 std::string 的每个实例需要在堆上分配内存来存储字符串。

关于c++ - std::vector push_back 是瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4006634/

相关文章:

c++ - 双向链表给出混合结果?

c++ - 向上转型到父类(super class)或接口(interface)?

c++ - CreateProcess 失败,错误为 0

c++ - 在类里面使用 Map 与 Vector - 速度

java - DefaultTableModel - 删除行更新 vector ,添加不会

c++ - 向 MPI 进程发送函数

c++ - CPreviewView 和命令处理程序

c++ - 无法创建二维数组

c++ - std::vector size()-1 是否总是给出最后一个元素的索引?

rust - 如何在不使用 for 循环的情况下将元组 Vec 中的两个嵌套 HashMap 转换?