【问题标题】:Iterating multimap with conditional statement使用条件语句迭代多图
【发布时间】:2017-09-15 15:37:17
【问题描述】:

首先,我使用的是C++98/03

我从第二个元素开始迭代我的多图:

multimap<pair<string, string>, pair<string, int> >::iterator it = paths.begin();
it++;

我有一个条件语句:如果当前迭代器中第一对的第一个元素等于前一个迭代器中第一对的第一个元素,那么做一些事情,例如。打印这些元素。

for(; it != paths.end(); it++) {
    if((*it).first.first == (*it--).first.first ) {
        it++;
        cout << (*it).first.first << " ";
        cout << (*it--).first.first << endl;
        it++;
    }
    else {
        it++;
    }
}

我的问题是如何使用迭代器的副本而不是在每个 (*it--) 之后将其递增?

【问题讨论】:

  • multimap&lt;pair&lt;string, string&gt;, pair&lt;string, int&gt; &gt;::iterator another_iterator = it?
  • 如果你可以交换两个输出的顺序,你可以简单地先打印it,然后递增,然后再打印it

标签: c++ c++98


【解决方案1】:

创建一个类似于 C++11 的 std::prev 的实用程序:

#include <algorithm>

template <class T>
T prev(T it)
{
    std::advance(it, -1);
    return it;
}

然后按如下方式使用:

for(; it != paths.end(); it++) {
    if((*it).first.first == prev(it)->first.first ) {
        cout << (*it).first.first << " ";
        cout << prev(it)->first.first << endl;
    }
    else {
        it++;
    }
}

【讨论】:

  • @OP 您还应该考虑保护代码免受诸如paths.size() == 1等极端情况的影响
【解决方案2】:

只需使用另一个迭代器:

 typedef multimap<pair<string, string>, pair<string, int> >::iterator iterator;
 for( iterator it = paths.begin(); it != paths.end(); ) {
     iterator prev = it++;
     if( it == paths.end() )
         break;
     if( prev->first.first == it->first.first ) {
         // output here
     }
 }

请注意您的代码不正确,首先它具有 UB,因为 == 未排序。但即使你在左侧使用不同的迭代器,你也会得到错误的行为:

 iterator it1 = it;
 if((*it1).first.first == (*it--).first.first ) { // not UB anymore, but result is always true as you compare the same element

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 2023-03-26
    • 2021-10-13
    • 2023-03-05
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多