陷入非常有趣的问题。
您可能以前在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)
{
}
}
如何使用迭代器实现相同的功能。
请建议。
答案 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;
}
}
任何其他有效的方法都会感激不尽。