2013-07-18 3 views
2

У меня две строки 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 от 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++; 
} 

Что здесь проблема?

+1

В стороне, конечно, вы должны использовать целочисленный тип данных для «транспозиций» вместо типа данных с плавающей запятой. – paddy

ответ

4

Вы, кажется, не проверяете границы s2_matches или v2_matches. Это будет иметь неопределенное поведение, когда s1 и s2 не являются идентичными:

while (!s2_matches[k]) k++; 
if (s1[i] == s2[k]) transpositions++; 
k++; 

т.е. Вы никогда не проверять k переполненные границы s2 или s2_matches. То же самое с векторной версией.

+0

Будет ли .at() делать трюк? – POD

+1

Нет, не полагайтесь на это. Он защищает вас от ошибок. Просто проверьте 'k paddy

Смежные вопросы