#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 это не могло быть повторено с помощью simplevector::iterator
. В моем случае я определил vector в локальной области, там не было необходимости использоватьconst_iterator
. Спасибо.
Ответ №2:
Кроме того, вы уверены, что хотите вставлять в std::vector? По соображениям производительности std::list был бы лучшим выбором. Кроме того, вставка в список не делает недействительными существующие итераторы, как это происходит для вектора.
Комментарии:
1. Да, вы правы, также не будет необходимости использовать последовательный блок памяти в случае большого объема данных. Я пересмотрю код.