如何让数组中的元素不增加,如果它已经增加了循环中的运行?
问题描述:
我正试图通过给定的输入来获取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
如何我如何我可以离开这条规则的任何帮助它已经被计算后会很好。谢谢
答
我不确定我是否明白你的意思,但是也许改变循环顺序会有帮助?
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
为什么'strcmp'如果你有权访问'std :: string'? –
如果目标是不增加,你为什么递增?只需将'counter [k]'设置为1或者我错过了什么? – PaulMcKenzie
目标是每当终端在规则的右侧结束时增加。如果终端多次出现,如果我已经算过第一个,我就不应该增加。 – muchtolearn