存储当前和下一个迭代器

时间:2015-01-06 00:07:12

标签: c++ iterator multimap

我有一个循环遍历每个键的每个键,然后遍历这些键的每个值。我为每个点创建一个RoadSegment,并希望使用这些值来设置RoadSegment的坐标。要做到这一点,我需要迭代开启的当前vec3以及序列中的下一个。

有没有办法在序列中存储下一个迭代,以便我可以引用值(* next).second 我尝试过创建另一个std :: multimap :: iterator 然后设置next = mapIt ++,但这似乎操纵了下一个循环的mapIt值,所以接下来的循环与下一个循环中的mapIt不同

非常感谢您的帮助。

    for(int i = 0; i < m_genRoads->getKeyValueData().size(); i++)
{
    int numberDesired = m_genRoads->getMultimapData().count(i) - 1;

    std::multimap<int, glm::vec3>::iterator mapIt;
    std::multimap<int, glm::vec3>::iterator next;
    std::pair<std::multimap<int, glm::vec3>::iterator, std::multimap<int, glm::vec3>::iterator> it;

    it = m_genRoads->getMultimapData().equal_range(i);

    for(mapIt = it.first; mapIt != it.second; mapIt++)
    {
        next = mapIt++;

        int distance = std::distance(it.first, mapIt);

        if(distance != numberDesired)
        {
            std::cout<<"MAKE ROAD SEGMENT"<<std::endl;
            RoadSegement* roadSegmentPointer = new RoadSegement();
            **roadSegmentPointer->setYcoord((*mapIt), (*next));
            roadSegmentPointer->setXcoord((*mapIt));**
            m_segmentArray.push_back(roadSegmentPointer);
        }

        else
        {
            std::cout<<"..................."<<std::endl;
            continue;
        }

1 个答案:

答案 0 :(得分:0)

了解preincrement和postincrement运算符的工作原理。特别是,后增量(mapIt++)会将next设置为mapIt的当前值,然后增加mapIt。在实践中,就好像你已经交换了两个,以便next指向当前对象,mapIt指向下一个对象。 此外,当循环继续时,mapIt++将导致您跳过下一个对象!我敢打赌你不打算这样做。< / p>

for ( mapIt = it.first; mapIt != it.second; mapIt++ )
{
    next = mapIt;
    ++next; // note that preincrement is generally faster for iterators
    if ( next == it.second ) {
        // Uh oh, next is pointing to your end object, so there is no next object! Now what??
    }
    /* do work */
}