开发者

stl vector::insert difference in Windows and linux?

开发者 https://www.devze.com 2023-02-28 05:36 出处:网络
there. I\'ve searched my question around here but failed to find anything relevant. This is the problem.

there. I've searched my question around here but failed to find anything relevant. This is the problem.

I have this code in the part of my program, doing kind of stupid sort by inserts.

I developed that in MSVS 2008 and it all worked fine, but when I tried to compile that with g++, it failed because of list::insert function below;

//...
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;
    }
}

as one can see, li is const_iterator of NewList; And NewElem has type pair with the same content type as NewList contents;

There you can see the response (unreadable):

main.cpp:447: error: no matching function for call to "std::vector<std::pair<unsigned int, double>, std::allocator<std::pair<unsigned int, double> > >::insert(__gnu_cxx::__normal_iterator<con开发者_如何转开发st 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: note: candidates are: __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: note: 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> >]

What can be the reason? And what is the possible solution?


The signature of the insert member function that you are trying to use is probably:

iterator insert( iterator, const value_type& );

But the first argument that you are passing to the function is a const_iterator, that cannot be implicitly converted to a non const iterator. That code should not have worked on VS either.

The simple solution is that if you intend to modify the container you use a non-const iterator: define li as std::vector< std::pair<uint,double> >::iterator li = NewList.begin();


Also, are you sure that you want to be inserting into a std::vector? For performance reasons, a std::list would be a better choice. Also, an insert on a list doesn't invalidate existing iterators as it does for a vector.

0

精彩评论

暂无评论...
验证码 换一张
取 消