stl vector:: вставить разницу в Windows и Linux?

#c #list #stl #g #compiler-errors

#c #Список #stl #g #ошибки компилятора

Вопрос:

там. Я искал свой вопрос здесь, но не смог найти ничего подходящего. В этом проблема.
У меня есть этот код в части моей программы, выполняющий какую-то глупую сортировку по вставкам.
Я разработал это в MSVS 2008, и все это работало нормально, но когда я попытался скомпилировать это с помощью g , это не удалось из-за list::insert функции ниже;

 //...
pair<uint, double> NewElem(i, Prob.at(i));
bool inserted(false);
vector<pair<uint, double> >::const_iterator li = NewList.begin();
for ( vector<double>::const_iterator ji = BlocksMemory.begin() ; ji != BlocksMemory.end() ;   ji)
{
    if (NewElem.second <= *ji)
        li  = _SORT_BLOCK;
    else
        break;
}
for(;li != NewList.end() ;   li)
{
    if (NewElem.second > li->second)
    {
        NewList.insert(li, NewElem );
        inserted = true;
        break;
    }
}
  

как можно видеть, li является const_iterator из NewList ;
И NewElem имеет тип pair с тем же типом содержимого, что и NewList содержимое;

Там вы можете увидеть ответ (нечитаемый):

main.cpp:447: ошибка: нет соответствующей функции для вызова « std::vector<std::pair<unsigned int, double>, std::allocator<std::pair<unsigned int, double> > >::insert(__gnu_cxx::__normal_iterator<const std::pair<unsigned int, double>*, std::vector<std::pair<unsigned int, double>, std::allocator<std::pair<unsigned int, double> > > >amp;, std::pair<unsigned int, double>amp;) «

/usr/include/c /4.4/bits/vector.tcc:106: примечание: кандидатами являются: __gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> > std::vector<_Tp, _Alloc>::insert(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, const _Tpamp;) [with _Tp = std::pair<unsigned int, double>, _Alloc = std::allocator<std::pair<unsigned int, double> >]

/usr/include/c /4.4/bits/stl_vector.h:850: примечание: void std::vector<_Tp, _Alloc>::insert(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, size_t, const _Tpamp;) [with _Tp = std::pair<unsigned int, double>, _Alloc = std::allocator<std::pair<unsigned int, double> >]

В чем может быть причина? И каково возможное решение?

Ответ №1:

Сигнатура insert функции-члена, которую вы пытаетесь использовать, вероятно,:

 iterator insert( iterator, const value_typeamp; );
  

Но первым аргументом, который вы передаете функции, является a const_iterator , который не может быть неявно преобразован в неконстантный iterator . Этот код также не должен был работать на VS.

Простое решение заключается в том, что если вы собираетесь модифицировать контейнер, вы используете неконстантный iterator : define li как std::vector< std::pair<uint,double> >::iterator li = NewList.begin();

Комментарии:

1. Да, спасибо… Будь я проклят, похоже, я очень устал, когда писал эту часть кода 🙂 Это было своего рода автоматизировано, я обычно передаю аргументы const amp; , поэтому в случае vector это не могло быть повторено с помощью simple vector::iterator . В моем случае я определил vector в локальной области, там не было необходимости использовать const_iterator . Спасибо.

Ответ №2:

Кроме того, вы уверены, что хотите вставлять в std::vector? По соображениям производительности std::list был бы лучшим выбором. Кроме того, вставка в список не делает недействительными существующие итераторы, как это происходит для вектора.

Комментарии:

1. Да, вы правы, также не будет необходимости использовать последовательный блок памяти в случае большого объема данных. Я пересмотрю код.