У меня странная проблема с каким-то простым кодом, использующим стандартные элементы библиотеки C ++ map и vector.
У меня есть график, который представлен как map<int, Edgelist>
, где Edgelist определен как vector<int>
. У меня также есть функция match
, которая сравнивает два графика и возвращает true
, если pattern
содержится в subject
.
Код является частью гораздо более крупного приложения, но наименьший пример компиляции, который демонстрирует эту проблему, находится здесь:
#include <vector>
#include <iostream>
#include <map>
typedef int Vertex;
typedef std::vector<Vertex> EdgeList;
typedef std::map<Vertex, EdgeList> PatternGraph;
typedef std::vector<Vertex>::iterator EdgeListIter;
typedef std::map<Vertex, EdgeList>::iterator GraphIter;
const Vertex ROOT = 1;
bool match(PatternGraph &pattern, Vertex p_start,
PatternGraph &subject, Vertex s_start)
{
int num_p, num_s;
num_p = pattern[p_start].size();
num_s = subject[s_start].size();
if (pattern[p_start].size() == 0)
return true;
if (subject[s_start].size() == 0)
return false;
if (pattern[p_start].size() != subject[s_start].size())
return false;
if (pattern[p_start].size() == 1) {
Vertex pattern_child, subject_child;
pattern_child = pattern[p_start][0];
subject_child = subject[s_start][0];
return match(pattern, pattern_child, subject, subject_child);
} else {
Vertex p1, p2, s1, s2;
p1 = pattern[p_start][0];
p2 = pattern[p_start][1];
s1 = subject[s_start][0];
s2 = subject[s_start][1];
return ((match(pattern, p1, subject, s1) && match(pattern, p2, subject, s2)) ||
(match(pattern, p2, subject, s1) && match(pattern, p1, subject, s2)));
}
}
bool test_match()
{
bool passed = true;
std::cout << "Running Match Test...";
PatternGraph p1, p2, p3;
p1[1] = std::vector<int>(2,3);
p1[2] = std::vector<int>(4,5);
p1[3] = std::vector<int>();
p1[4] = std::vector<int>();
p1[5] = std::vector<int>();
p2[1] = std::vector<int>(2,3);
p2[2] = std::vector<int>(4,5);
p2[3] = std::vector<int>();
p2[4] = std::vector<int>();
p2[5] = std::vector<int>();
p3[1] = std::vector<int>(2);
p3[2] = std::vector<int>(3,4);
p3[3] = std::vector<int>();
p3[4] = std::vector<int>();
if (!match(p1, ROOT, p2, ROOT)) {
std::cout << "P1 Does not Match P2 when it should" << std::endl;
passed = false;
} else if (match(p2, ROOT, p3, ROOT)) {
std::cout << "P2 matches P3 when it shouldn't" << std::endl;
passed = false;
} else {
std::cout << "Match Test Passed." << std::endl;
}
return passed;
}
int main(int argc, char *argv[])
{
test_match();
return 0;
}
Выходные данные: «Запуск проверки соответствия ... P2 соответствует P3, когда не должно»
Я отладил этот код и обнаружил, что по какой-то причине при вызове match(p2, ROOT, p3, ROOT)
размеры p2[1]
и p3[1]
равны 2
, когда p2[1]
должен быть равен 2
и p3[1]
должно быть равно 1
.
Я в тупике, и любая помощь приветствуется. Я использую компилятор g ++ от Apple 4.2.1