【发布时间】: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