【问题标题】:Optimizing conversion between bases - C++优化基数之间的转换 - C++
【发布时间】:2016-03-20 13:36:39
【问题描述】:

我正在设计一个密码,需要在循环中重复地在碱基之间进行转换。我已经优化了其他所有内容,但我对 C++ 代码不太熟悉,并且正在尝试弄清楚如何使转换更快。

这是我正在使用的当前代码:

string digits = "0123456789abcdef";
string tohex(string number) {                        // Decimal to Hexadecimal function
    long length = number.length();
    string result = "";
    vector<long> nibbles;
    for ( long i = 0; i < length; i++ ) {
        nibbles.push_back(digits.find(number[i]));
    }
    long newlen = 0;
    do {
        long value = 0;
        newlen = 0;
        for ( long i = 0; i < length; i++ ) {
            value = (value * 10) + nibbles[i];
            if (value >= 16) {
                nibbles[newlen++] = value / 16;
                value %= 16;
            } else if (newlen > 0) {
                nibbles[newlen++] = 0;
            };
        };
        length = newlen;
        result = digits[value] + result;
    } while (newlen != 0);
    return result;
}

【问题讨论】:

  • 您是否尝试通过分析器运行它?
  • 如果代码已经按预期运行但感觉太慢,请尝试询问Code Review 的问题:)
  • push_back 会杀了你。
  • @MikeDunlavey,我认为这是上述代码中操作的最小问题..
  • result = digits[value] + result 将是 O(n²) 如果完成 O(n) 次。不要那样做。

标签: c++ string performance optimization converter


【解决方案1】:

在我的情况下(密码),该数字将始终适合 int,因此可以这样做:

string tohex(string number) {
    int num = std::stoi(number);
    std::stringstream hexnumber;
    hexnumber << std::hex << num;
    return hexnumber.str();
}

这样更好,因为它更简单并且使用内置的 std::hex 方法。

【讨论】:

  • 这仅适用于提供适合 int 的数字 - 否则您将收到 out_of_range 异常。如果它完全无效,它会喷出invalid_argument
  • 对这段代码的作用、它解决了什么问题以及它如何变得更好的一些解释在这里很重要。
猜你喜欢
  • 2021-12-30
  • 1970-01-01
  • 2011-10-24
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多