使用迭代器C ++的嵌套循环

时间:2014-09-13 14:13:16

标签: c++

陷入非常有趣的问题。

您可能以前在C / C ++

中完成了这项工作
map<string, string> dict;
dsz = dict.size();

vector<string> words;
int sz = words.size();

for(int i = 0; i < sz; ++i)
{
   for(int j = i + 1; j < dsz; ++j)
   {
   }
}

如何使用迭代器实现相同的功能。

请建议。

2 个答案:

答案 0 :(得分:0)

你的最终意图并不完全清楚,因为你在i + 1上启动了j循环(见最后的评论)。在你澄清这种关系之前,我建议你提出两个临时解决方案

方法1:轻松优雅:

您使用基于()的新C ++ 11范围。它使用一个以begin()开头并一直到end()的迭代器,而不必为这个迭代器而烦恼:

for (auto x : words)  {    // loop on word  (size sz) 
    for (auto y : dict) {  // loop on dict (size dsz)
        // do something with x and y, for example: 
        if (x==y.first)
            cout << "word " << x << " matches dictionary entry " << y.second << endl;
    }
}

方法2:传统的迭代器使用

您还可以指定要使用的显式迭代器。这比前面的例子稍微冗长一点,但它允许你选择最合适的迭代器,例如,如果你想要像cbegin()而不是begin()那样的常量迭代器,如果你想跳过一些元素或使用迭代器上的改编器,例如reverse_iterator等:

for (auto itw = words.begin(); itw != words.end(); itw++) {
    for (auto itd = dict.begin(); itd != dict.end(); itd++) {
        // do simething with *itw and *itd, for example: 
        if (*itw == itd->first)
            cout << "word " << *itw << " matches dictionary entry " << itd->second << endl;
    }
}

备注:

只有word向量的元素与dict map中的元素相关(ok,它们也是cerainly单词),并且j = i + 1的intter循环的开始才有意义。您在地图中访问的元素的顺序与向量中的顺序相关。由于地图是根据密钥排序的,因此只有单词才会按照相同的密钥进行排序。是这样的吗?

如果您仍想跳过元素或根据元素之间的距离进行计算,则您应考虑上面提出的第二种方法。这样可以更容易地使用distance(itw, words.begin()),这相当于i。

但是,最好使用利用其设计的容器。因此,不是通过字典地图迭代来查找单词条目,而是按照以下方式使用地图更好:

for (auto x : words)  {    // loop on word  (size sz) 
    if (dict.count(x))    // if x is in dictionary 
        cout << "word " << x << " matches dictionary entry " << dict[x] << endl;
}

答案 1 :(得分:0)

确定。 我明白了。 更准确地说,我想要内圈中的i和j。

这里我使用了迭代器,抱歉,由于需求的变化,我必须转移到multimap而不是map。

vector<string>::iterator vit;
multimap<string, string>::iterator top = dict.begin();
multimap<string, string>::iterator mit;
for(vit = words.begin(); vit != words.end(); ++vit)
{
  string s = *vit;
  ++top;
  mit = top;
  for(; mit != dict.end(); ++mit)
  {
    /* compare the value with other val in dictionary, if found, print their keys */
    if(dict.find(s)->second == mit->second)
      cout << s <<" = "<< mit->first << endl;
  }
}

任何其他有效的方法都会感激不尽。