c++ - 运行Levenstein代码时出现问题

标签 c++ constants levenshtein-distance

在对Levenstein进行编程时,存在一个问题。它是从Internet提取的代码。

代码如下:

#define MIN3(a, b, c) ((a) < (b) ? ((a) < (c) ? (a) : (c)) : ((b) < (c) ? (b) : (c)))

int levenshtein(char *s1, char *s2) {
    unsigned int s1len, s2len, x, y, lastdiag, olddiag;
    s1len = strlen(s1);
    s2len = strlen(s2);
    unsigned int column[s1len + 1];
    for (y = 1; y <= s1len; y++)
        column[y] = y;
    for (x = 1; x <= s2len; x++) {
        column[0] = x;
        for (y = 1, lastdiag = x - 1; y <= s1len; y++) {
            olddiag = column[y];
            column[y] = MIN3(column[y] + 1, column[y - 1] + 1, lastdiag + (s1[y - 1] == s2[x - 1] ? 0 : 1));
            lastdiag = olddiag;
        }
    }
    return(column[s1len]);
}

问题出在以下语句中:unsigned int column[s1len + 1];上的unsigned int s1len:

Error: Expression must have a constant value.

最佳答案

您遇到的问题是C++语言不支持可变长度数组(VLA)。您从互联网上收集的代码可能/可能被编写为C,这是C++不同的一种语言,并且确实支持VLA(自C99标准IIRC起)。

您可以使用C++容器(代替VLA)来“修复”您的代码,使其与标准std::vector一起使用。确保包括<vector>头文件:

#include <vector>
//.. .
// unsigned int column[s1len + 1];  // NOT standard C++
   std::vector<unsigned int>column(s1len + 1);

您可以使用其[]运算符访问 vector 的元素,因此无需在代码中进行任何其他更改。

注意:某些C++实现确实支持VLA(我认为GNU g++是支持VLA的)-但是标准不支持。

关于c++ - 运行Levenstein代码时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59701060/

相关文章:

c++ - 如何使用值为 0 的对象初始化指针

c - 如何防止宏在转换时隐藏 'const' (C)

ios - let (constant) 表现得像一个函数的语法。你可以解释吗?

ruby - Ruby 字符串字典中的快速模糊/近似搜索

text - 如何计算字母频率相似度?

python - 自定义 python-levenshtein 字符值

c++ - CMFCCaptionMenuButton 替代品?

c++ - 带有 boost boost::program_options 和 options_description 的 RAII

c++ - 比从基类转换到派生类更好的方法

c++ - 这里声明了什么?