如何让数组中的元素不增加,如果它已经增加了循环中的运行?

如何让数组中的元素不增加,如果它已经增加了循环中的运行?

问题描述:

我正试图通过给定的输入来获取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

我不确定我是否明白你的意思,但是也许改变循环顺序会有帮助?

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 <:string>'而不是'std :: vector <:string>'。 std :: set不存储重复项。 – PaulMcKenzie