2016-09-29 108 views
-1

我正試圖通過給定的輸入來獲取CFG的摘要。我必須列出終端出現次數的次數。但是,我在使用同一規則計算多個終端時遇到了問題。如何讓數組中的元素不增加,如果它已經增加了循環中的運行?

for (int i = 0; i < cfg.size(); i++) 
{ 
    for (int j = 0; j < cfg[i].size(); j++) 
    { 
     for (int k = 0; k < terminal.size(); k++) 
     { 
      if (strcmp(cfg[i][j].c_str(), terminal[k].c_str()) == 0) 
      { 
       //TO-DO if counter[k] already incremented do not increment counter[k] again 
       counter[k]++; 
       break; 
      } 
     } 
    } 
} 

例如,如果規則是

Z -> a b b b 

它將返回3 b當正確的答案應該是1

如何我如何我可以離開這條規則的任何幫助它已經被計算後會很好。謝謝

+1

爲什麼'strcmp'如果你有權訪問'std :: string'? –

+0

如果目標是不增加,你爲什麼遞增?只需將'counter [k]'設置爲1或者我錯過了什麼? – PaulMcKenzie

+0

目標是每當終端在規則的右側結束時增加。如果終端多次出現,如果我已經算過第一個,我就不應該增加。 – muchtolearn

回答

1

我不確定我是否明白你的意思,但是也許改變循環順序會有幫助?

for (int i = 0; i < cfg.size(); ++i) 
{ 
    for (int k = 0; k < terminal.size(); ++k) 
    { 
     for (int j = 0; j < cfg[i].size(); ++j) 
     { 
      if (strcmp(cfg[i][j].c_str(), terminal[k].c_str()) == 0) 
      { 
       ++counter[k]; 
       break; 
      } 
     } 
    } 
} 
+1

我正在接近整個問題不正確。我所要做的就是確保我添加到cfg的載體沒有重複以避免這個問題。謝謝你! – muchtolearn

+0

@muchtolearn然後你使用了錯誤的STL容器,如果你不想重複的話。你應該使用'std :: set '而不是'std :: vector '。 std :: set不存儲重複項。 – PaulMcKenzie