c++ - 帮助优化此索引到行列,反之亦然算法

标签 c++ algorithm optimization

这是我的问题。我在我的游戏中为我的 Gui 制作了一个文本框。

它所做的是,每次我调整它的大小时,因为它自动换行,我必须弄清楚插入符号在文本字符串中的哪个索引,然后我需要在重新调整后将其转换为正确的行列。根据我的分析器,最慢的部分是当我获得下一个要评估的 unicode 字符时:

int AguiTextBox::indexFromColumnRow( int column, int row, bool includeUnwantedChars ) const
    {
        size_t rowLen = 0;

        int retIndex = -1;
        int bytesSkipped = 0;
        int curCharLen = 0;
        std::string curChar;

        std::string::const_iterator it = getText().begin();
        std::string::const_iterator end = getText().end();


        //decrement column so that the lowest is -1
        column--;
        if(textRows.size() == 0 || (column == -1 && row == 0))
        {
            //not in the text
            return -1;
        }
0.01s       for(size_t i = 0; i < textRows.size(); ++i)
        {
            //get length of row
0.00s           rowLen = _unicodeFunctions.getUtf8StringLength(textRows[i]);

            //handle -1th case

            //get next character
            do 
            {
0.00s               curCharLen = _unicodeFunctions.bringToNextUnichar(it,end);
0.01s               curChar = getText().substr(bytesSkipped,curCharLen);
                bytesSkipped += curCharLen;
                if(includeUnwantedChars)
                    retIndex++;
            } while (curChar[0] >= 0 && curChar[0] < ' ' && curChar != "\n");

            if(!includeUnwantedChars)
            retIndex++;

            //only increase for newlines
0.00s           if(curChar != "\n")
            {
                bytesSkipped -= curCharLen;
                retIndex--;
                it -= curCharLen;
            }

            if((int)i == row && column == -1)
            {
                return retIndex;
            }


0.06s           for(size_t j = 0; j < rowLen; ++j)
            {
                //get next character
                do 
                {
0.10s                   curCharLen = _unicodeFunctions.bringToNextUnichar(it,end);
0.91s                   curChar = getText().substr(bytesSkipped,curCharLen);
0.03s                   bytesSkipped += curCharLen;

0.03s                   if(includeUnwantedChars)
                        retIndex++;

0.11s               } while (curChar[0] >= 0 && curChar[0] < ' ' && curChar != "\n");

0.06s               if(!includeUnwantedChars)
0.00s                   retIndex++;

0.02s               if((int)i == row && (int)j == column)
                {
                    return retIndex;
                }
            }
        }

        return retIndex;
    }

我该如何优化它?

谢谢

@Erik 关于字符的双端队列是什么意思?

最佳答案

您正在使用以下内容提取子字符串:

curChar = getText().substr(bytesSkipped,curCharLen);

但是你只使用第一个元素。您可以通过简单地提取所需的 char 来避免字符串构造/复制。

关于一般算法优化 - 我将花费构建字符对象的 deque 所需的资源,而不是使用 std::string。这将使您可以直接索引任何字符,而无需一遍又一遍地扫描和解析相同的 utf-8 序列。

关于c++ - 帮助优化此索引到行列,反之亦然算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5320057/

相关文章:

optimization - 从 scapy 中的 PCAP 文件获取 IP 地址

c++ - 如何在 for 循环内暂停

database - Neo4j 和算法

c - gcc 是否自动 "unroll"if 语句?

java - 优化/改进我的 SQL 更新

java - 查找子集大小大于或等于 2 的数组的所有子集

c++ - 检查 C++ 中 CAPSLOCK 是否打开/关闭

c++ - 当在头文件而不是 CPP 文件上实现时,析构函数会导致内存泄漏 - 仅在 linux 上

android - Firebase 崩溃报告 - 它现在支持 NDK 吗?

java - 3 分区的中位数