【问题标题】:Why std::vector::insert failed when insert duplicated element in VS2010?为什么在 VS2010 中插入重复元素时 std::vector::insert 失败?
【发布时间】:2016-09-19 12:09:13
【问题描述】:
class RawPixElement{
public:
    CRawPixElement(int iRes) : m_iResolution(iRes) {
        m_szRawData = new unsigned char[iRes * iRes];
    };

    ~CRawPixElement() { if(m_szRawData) delete[] m_szRawData; };

    CRawPixElement(const CRawPixElement &elem) : m_iResolution(elem.m_iResolution) {
        m_szRawData = new unsigned char[m_iResolution * m_iResolution];
        memcpy(m_szRawData, elem.m_szRawData, m_iResolution * m_iResolution);
    };

    CRawPixElement & operator=(const CRawPixElement &elem) {
        m_iResolution = elem.m_iResolution;
        memcpy(m_szRawData, elem.m_szRawData, m_iResolution * m_iResolution);
        return *this;
    };
private:
    CRawPixElement();
public:
    int m_iResolution;
    unsigned char *m_szRawData;
};

typedef std::vector<RawPixElement> RawPixList;
RawPixList rpl;

void addElement(const RawPixElement& elem) {
    // find pos
    RawPixList::const_iterator iter = rpl.cbegin();
    for (; iter != rpl.cend(); iter++) {
        if (iter->getResolution() <= elem.getResolution()) {
            break;
        }
    }
    // rpl.insert(rpl.end(), elem) is OK. but not with rpl.begin()
    rpl.insert(iter, elem);
}

int main(){
    RawPixElement e1(128);
    RawPixElement e2(32);
    RawPixElement e3(256);
    RawPixElement e4(8);
    RawPixElement e5(64);
    RawPixElement e6(32);
    addElement(e1);
    addElement(e2);
    addElement(e3);
    addElement(e4);
    addElement(e5);
    addElement(e6);  // Exception here!!!!!!!!!!!!!!!!!!!!!!!!
    return 0;
}

我使用了 std::vector 并想对其中的元素进行排序。 因此,当向向量添加元素时,它将通过调用函数“addElement()”插入到指定的位置,但不会使用“push_back()”将元素推到向量的尾部。 通过这种方式,向量在使用时保持有序。 但是在 VS2010 上,当在代码中调用最后一个 'addElement()' 时,它发生了一个运行时错误,似乎是 stl 异常。我在C++11和C++14标准下测试了gcc和clang上的代码,它们也都出现了错误。 我使用 std::vector 的方式是错误的,还是我对向量不了解?记录一下:在“开始迭代器”处插入相同的序列时会发生相同的错误,但在“结束迭代器”处可以。我觉得难以置信!

【问题讨论】:

  • 类名是CRawPixElement,不是RawPixElement。抱歉打错了。
  • 问题底部有一个编辑按钮,您可以使用它来解决这个问题。或者你可以用这个edit
  • 这里为什么要手动管理内存?
  • 为什么要在插入时进行手动排序?实现你想要做的最好的方法是使用 std::multimap。在您的情况下,数据可以简单地定义为 std::vector。 Multimap 将使您插入的元素自动排序,并且插入速度更快。
  • 代码是一个demo来描述我遇到的问题,我没有使用multi-map的原因是数据类型是在其他模块中定义的,我只是像在'main中一样使用它'。是的,我知道多图可以满足我的要求,并且我也想知道 vector::insert 的问题是什么。谢谢。

标签: c++ visual-studio-2010 c++11 vector stl


【解决方案1】:

当m_res大于旧元素的值时,需要在“operator=”中重新分配。

【讨论】:

    猜你喜欢
    • 2019-12-03
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多