2011-05-03 82 views
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]應等於2p3[1]應該等於1

我難住,任何幫助表示讚賞。我使用的編譯器是蘋果公司的克++ 4.2.1

回答

2

這產生與2個元素的向量初始化爲0:

p3[1] = std::vector<int>(1, 2); 
+0

p3[1] = std::vector<int>(2); 

這與初始化爲2的一個元件創建矢量D'哦。我知道這是愚蠢的。謝謝一堆。我會的時候會接受這個 – Kevin 2011-05-03 17:52:35