为什么在VS2010中插入重复元素时std :: vector :: insert失败了?

时间:2016-09-19 12:09:14

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

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错误的方式,还是我不知道有关向量的东西?对于记录:在'begin iterator'处插入相同的序列时会发生相同的错误,但在'end iterator'处可以。我觉得这简直令人难以置信!

1 个答案:

答案 0 :(得分:0)

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