实例:
class A
{
//略
public:
void SetValueItem(long lValue)
{
DATA_IT it = m_data.begin();
for(; it != m_data.end(); it++)
{
if((*it)%lValue == lValue)
{
m_data.erase(it); 如果这样,由于erase(it) 会使it 空指向,导致程序就有可能报错,
}
}
}
private:
typedef std::vector<long> DATA,*PDATA
typedef std::vector<long>::iterator DATA_IT;
DATA m_data;
};
对于这种比较低级的错误,如果要修改是不是会感觉有点儿麻烦:
方法1: 用个临时迭代器 来保存要去除的迭代器;
方法2:去修改it = m_data.erase(it);
方法3: 直接用stl 的api remove_if,我个人比较认可这种方法;
实现:
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
UnaryPredicate pred)
{
ForwardIterator result = first;
while (first!=last) {
if (!pred(*first)) {
*result = *first;
++result;
}
++first;
}
return result;
}
用法:
#include <iostream> // std::cout #include <algorithm> // std::remove_if
bool IsOdd (int i) { return ((i%2)==1); } int main () { int myints[] = {1,2,3,4,5,6,7,8,9}; // 1 2 3 4 5 6 7 8 9 // bounds of range: int* pbegin = myints; // ^ int* pend = myints+sizeof(myints)/sizeof(int); // ^ ^ pend = std::remove_if (pbegin, pend, IsOdd); // 2 4 6 8 ? ? ? ? ? // ^ ^ std::cout << "the range contains:"; for (int* p=pbegin; p!=pend; ++p) std::cout << ' ' << *p; std::cout << '\n'; return 0; }
个人感受:这个bug 让我感觉到,个人的想法是有限的,对于一些基本的操作最好使用别人已经验证好的api,这样可以减少你的开发时间,提高效率。
可以用这些时间来考虑需求本身及程序结构的问题。看来,以后尽量站在巨人的肩上,让自己看的更远一些。
最近,我正在做c++资源管理的东西,但还有几点儿没想明白,到时候整理完了,麻烦各位指点指点。
好了,该说的都说完了,求喷!