stl vector :: вставить разницу в Windows и Linux? - PullRequest
0 голосов
/ 21 апреля 2011

есть.Я искал свой вопрос здесь, но не смог найти ничего подходящего.Вот в чем проблема.
У меня есть этот код в части моей программы, который выполняет глупую сортировку по вставкам.
Я разработал это в 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 из NewListNewElem имеет тип 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> > > >&, std::pair<unsigned int, double>&)"

/ 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 _Tp&) [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 _Tp&) [with _Tp = std::pair<unsigned int, double>, _Alloc = std::allocator<std::pair<unsigned int, double> >]

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

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

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

iterator insert( iterator, const value_type& );

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

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

1 голос
/ 21 апреля 2011

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

...