1

给定一张地图,我需要检索和操作两个立即存储的项目。对我来说,处理向量更容易,因为我可以执行“iter + 1”或“iter - 1”。而对于地图,我不走运。

例如,我举一个简单的例子如下: 注意:在我的实际应用中,我不会简单地减去这些数字。

int main ()
{
    map<char,int> mymap;
    map<char,int>::iterator it;

    mymap['b'] = 100;
    mymap['a'] = 200;
    mymap['c'] = 300;

    // show content:
    map<char,int>::iterator firstItem  = mymap.begin();
    map<char,int>::iterator secondItem = ++mymap.begin();

    for ( ; secondItem != mymap.end(); ++firstItem, ++secondItem )
        cout << secondItem->second - firstItem->second << endl;

    return 0;
}

问题> 有没有更好的解决方案?

谢谢

4

6 回答 6

2

不要在循环控制中递增两个迭代器(递增有点慢),只需先赋值firstItem = secondItem然后递增secondItem

于 2012-10-09T15:31:56.587 回答
2

您可以使用单个迭代器来完成。将增量从标题移动到循环的中间,并在到达地图末尾时退出循环,如下所示:

map<char,int>::iterator item  = mymap.begin();
for (;;) {
    int first = item->second;
    ++item;
    if ( item == mymap.end()) break;
    cout << item->second - first << endl;
}
于 2012-10-09T15:32:30.503 回答
2

如果地图为空,您当前的循环将显示未定义的行为。

您的循环可以重写(更简单,并检查空地图),如下所示:

int main(int argc, char * argv[])
{
    map<char,int> mymap;
    map<char,int>::iterator it;

    mymap['b'] = 100;
    mymap['a'] = 200;
    mymap['c'] = 300;

    for ( it = ( mymap.begin() == mymap.end() ? mymap.end() : std::next(mymap.begin()) ) ; it != mymap.end(); ++it )
        cout << it->second - std::prev(it)->second << endl;

    return 0;
}
于 2012-10-09T15:33:35.650 回答
2

这是风格问题。你可以做例如。

auto first = m.begin();

if (first != m.end())
{
    auto second = first;
    second++;

    for (; second != m.end(); first = second++)
    {
        ...        
    }
}

在地图为空的情况下,您还可以更优雅地进行救助。例如,您可以这样做:

if (m.empty()) return;

auto first = m.begin(), second = first;

for (second++; second != m.end(); first = second++)
{
   ...
}

如果可以的话,我会支持后者,只有在必须时才使用前者。

于 2012-10-09T15:34:30.300 回答
1

如果地图为空,您的代码将具有未定义的行为,但除此之外,这似乎是一种合理的方法,具体取决于您的总体目标。由于map迭代器不是随机访问,您不能只加或减一,只能增加/减少。

另一种方法是制作迭代器的副本,然后在循环内递增。

于 2012-10-09T15:30:45.843 回答
0

既不好也不坏,只是一种选择:

if (map.size() >=2)
std::accumulate(
  ++mymap.begin(),
  mymap.end(),
  mymap.begin(),
  [](mymap_type::const_iterator iprev, mymap_type::value_type const& entry)->mymap_type::const_iterator
  { 
    /* do something */;
    return ++iprev; 
  });
于 2012-10-09T15:36:15.330 回答