我有两个字符串s1:"abcd"
和s2:"ab"
和两个int向量v1:12,13,14,15
和v2:12,13
。我正在计算两个字符串和两个向量之间的距离。我从网上获得了c
文件的代码来计算两个字符串之间的距离。我正在修改代码以计算两个向量之间的距离,但是在c++
中。代码正在运行,但结果并不相同
(两次计算的距离应相同)。问题来自:
double transpositions = 0.0;
for (i = 0; i < s1_len; i++) {
if (!s1_matches[i]) continue;
while (!s2_matches[k]) k++;
if (s1[i] == s2[k]) transpositions++;
k++;
}
s1_len
为s1_len(s1)
(s2相同),s1_match
为int *s1_matches = (int*) calloc(s1_len, sizeof(int))
。
我正在使用正确的答案运行c
代码,但是当我将代码更改为c++
并将字符串变量更改为向量变量时,我获得的transposition
的数字是不同的。
要将字符串更改为矢量,我会将v1_len
的矢量(v1.size()
)和v1_match
的{{1}}的大小调整为int *v1_matches = (int*) calloc(v1_len, sizeof(int))
。
代码完全相同:
double transpositions = 0.0;
for (i = 0; i < v1_len; i++) {
if (!v1_matches[i]) continue;
while (!v2_matches[k]) k++;
if (v1[i] == v2[k]) transpositions++;
k++;
}
这里有什么问题?
答案 0 :(得分:4)
您似乎没有对s2_matches
或v2_matches
进行任何边界检查。当s1
和s2
不相同时,这会有未定义的行为:
while (!s2_matches[k]) k++;
if (s1[i] == s2[k]) transpositions++;
k++;
ie 您永远不会检查k
溢出s2
或s2_matches
的范围。与矢量版本相同。