Вставка в вектор - PullRequest
       4

Вставка в вектор

0 голосов
/ 26 июля 2011
    unsigned int j   = 0;
    openListIterator = openListVector.begin ();
    while (exitPointDetailsVector[lowestWeightedPointInOpenList.pointId].branchesVector[m].connectedExitPoint >= openListVector[j].pointId)
           && (openListIterator <= openListVector.end()))
    {
        // Move the iterator.
        openListIterator++;
        // Move the index.
        j++;
    }

    // Insert in the vector in the required position.
    listStruct objOpenListStruct;
    objOpenListStruct.pointId       = exitPointDetailsVector[lowestWeightedPointInOpenList.pointId].branchesVector[m].connectedExitPoint;
    objOpenListStruct.weight        = exitPointDetailsVector[lowestWeightedPointInOpenList.pointId].weight + exitPointDetailsVector[lowestWeightedPointInOpenList.pointId].branchesVector[m].distance;
    objOpenListStruct.parentPointId = exitPointDetailsVector[lowestWeightedPointInOpenList.pointId].exitPoint;

    ***********openListVector.insert (openListIterator, objOpenListStruct);

Этот код находится в цикле for.Но я поместил правильную инициализацию итератора, все еще я получаю ошибку сегментации, в звездной строке.

Любые подсказки?

Ответы [ 4 ]

2 голосов
/ 26 июля 2011

Мой немедленный совет: не делай этого.Если вы хотите сохранить коллекцию элементов в отсортированном порядке, вам, вероятно, следует использовать std::set (если вставка не является относительно необычной).Если вы собираетесь использовать отсортированный вектор, вы также можете воспользоваться его сортировкой и использовать двоичный поиск, чтобы найти точку вставки (например, с std::lower_bound).

Похоже, проблемавы в настоящее время испытываете недопустимый итератор, когда вам нужно / хотите добавить в конец коллекции.Это (среди прочих вопросов) будет обрабатываться автоматически с использованием предварительно упакованного алгоритма поиска (или std::set или std::multiset).

2 голосов
/ 26 июля 2011

Вот подсказка.Вы не можете использовать оператор <= для итераторов: </p>

openListIterator <= openListVector.end()

, поэтому ваш итератор может быть неэффективным.

2 голосов
/ 26 июля 2011

В операторе openListIterator <= openListVector.end(), если вы достигнете openListIterator == openListVector.end(), у вас возникнет ошибка, потому что, когда код достигнет openListIterator++, ваш итератор выходит из-под контроля

Попробуйте openListIterator != openListVector.end()

1 голос
/ 26 июля 2011

Интересно, каков может быть эффект:

       && (openListIterator <= openListVector.end()))

Действительно, в первой части предложения while вы не используете openListIterator, поэтому вполне может быть, что циклвходит, когда openListIterator равно openListVector.end(), а затем увеличивается.Итак, когда вы делаете вставку, вы получаете ошибку сегментации ...

Не могли бы вы проверить это условие, когда у вас есть ошибка сегментации?

Если это является причиной проблемы, выможно использовать вместо:

       && (openListIterator < openListVector.end()))
...