0
我遇到了一个奇怪的问题,它使用标准的C++库元素映射和向量来创建一些简单的代码。比较std :: vector时出错Size
我有一个图表,表示为map<int, Edgelist>
,其中Edgelist定义为vector<int>
。如果pattern
包含在subject
中,我也有一个match
函数用于比较两个图表并返回true
。
的代码是一个更大的应用程序的一部分,但出现此问题的最小编译样本是在这里:
#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相匹配时,它不该” T” 我已经调试此代码后发现,由于某些原因,当match(p2, ROOT, p3, ROOT)
被调用的p2[1]
和p3[1]
大小都等于2
,当p2[1]
应等于2
和p3[1]
应该等于1
。
我难住,任何帮助表示赞赏。我使用的编译器是苹果公司的克++ 4.2.1
:
这与初始化为2的一个元件创建矢量D'哦。我知道这是愚蠢的。谢谢一堆。我会的时候会接受这个 – Kevin 2011-05-03 17:52:35