【问题标题】:stl vector::insert difference in Windows and linux?stl vector::insert 在 Windows 和 linux 中的区别?
【发布时间】:2011-04-20 20:39:30
【问题描述】:

那里。我在这里搜索了我的问题,但没有找到任何相关的内容。 这就是问题所在。
我在程序的一部分中有这段代码,通过插入进行了一种愚蠢的排序。
我在 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;
    }
}

可以看到,liNewListconst_iterator; 而NewElem 的类型为pair,其内容类型与NewList 的内容类型相同;

在那里你可以看到响应(不可读):

main.cpp:447: 错误:没有匹配函数调用“std::vector&lt;std::pair&lt;unsigned int, double&gt;, std::allocator&lt;std::pair&lt;unsigned int, double&gt; &gt; &gt;::insert(__gnu_cxx::__normal_iterator&lt;const std::pair&lt;unsigned int, double&gt;*, std::vector&lt;std::pair&lt;unsigned int, double&gt;, std::allocator&lt;std::pair&lt;unsigned int, double&gt; &gt; &gt; &gt;&amp;, std::pair&lt;unsigned int, double&gt;&amp;)

/usr/include/c++/4.4/bits/vector.tcc:106:注意:候选人是:__gnu_cxx::__normal_iterator&lt;typename std::_Vector_base&lt;_Tp, _Alloc&gt;::_Tp_alloc_type::pointer, std::vector&lt;_Tp, _Alloc&gt; &gt; std::vector&lt;_Tp, _Alloc&gt;::insert(__gnu_cxx::__normal_iterator&lt;typename std::_Vector_base&lt;_Tp, _Alloc&gt;::_Tp_alloc_type::pointer, std::vector&lt;_Tp, _Alloc&gt; &gt;, const _Tp&amp;) [with _Tp = std::pair&lt;unsigned int, double&gt;, _Alloc = std::allocator&lt;std::pair&lt;unsigned int, double&gt; &gt;]

/usr/include/c++/4.4/bits/stl_vector.h:850:注意:void std::vector&lt;_Tp, _Alloc&gt;::insert(__gnu_cxx::__normal_iterator&lt;typename std::_Vector_base&lt;_Tp, _Alloc&gt;::_Tp_alloc_type::pointer, std::vector&lt;_Tp, _Alloc&gt; &gt;, size_t, const _Tp&amp;) [with _Tp = std::pair&lt;unsigned int, double&gt;, _Alloc = std::allocator&lt;std::pair&lt;unsigned int, double&gt; &gt;]

可能是什么原因?什么是可能的解决方案?

【问题讨论】:

    标签: c++ list stl g++ compiler-errors


    【解决方案1】:

    您尝试使用的insert 成员函数的签名可能是:

    iterator insert( iterator, const value_type& );
    

    但您传递给函数的第一个参数是const_iterator,它不能隐式转换为非 const iterator。该代码也不应该在 VS 上运行。

    简单的解决方案是,如果您打算修改容器,请使用非常量 iterator:将 li 定义为 std::vector&lt; std::pair&lt;uint,double&gt; &gt;::iterator li = NewList.begin();

    【讨论】:

    • 是的,谢谢...我该死的,看起来我在编写这部分代码时很累 :) 这有点自动,我通常在 const &amp; 上传递参数,所以在向量的情况下,它不能用简单的vector::iterator 进行迭代。就我而言,我在本地范围内定义了向量,因此无需使用const_iterator。谢谢。
    【解决方案2】:

    另外,您确定要插入到 std::vector 中吗?出于性能原因, std::list 将是更好的选择。此外,列表中的插入不会像对向量那样使现有迭代器无效。

    【讨论】:

    • 是的,你是对的,在大量数据的情况下也不需要使用顺序内存块。我会修改代码。
    猜你喜欢
    • 2015-08-22
    • 1970-01-01
    • 2015-01-20
    • 2022-01-12
    • 2020-12-01
    • 2020-07-22
    • 2011-07-12
    • 2016-09-27
    • 1970-01-01
    相关资源
    最近更新 更多