使用递归方法将矢量作为输入时进行分割故障



我正在尝试使用递归制作一个非常简单的过滤器,但是由于某种原因,我不断得到这些SEG错误。

#include <iostream>
#include <vector>
#include <math.h>
class FilterGeneric {
public:
    std::vector<int> filter(std::vector<int>& v, std::vector<int>::iterator i); //set i=v.begin() in main
private:
    virtual bool g(int x) =0;
    std::vector<int> result;
};
std::vector<int> FilterGeneric::filter(std::vector<int>& v, std::vector<int>::iterator i)   {
    if (i==v.end()) {
        return result;
    }   else    {
        if (g(*i)==true)    {
            result.push_back(*i);
            i++;
            return filter(v,i);
        }   else    {
            i++;
            return filter(v,i);
        }
    }
}
class FilterOdd : public FilterGeneric  {
private:
    bool g(int x);
};
bool FilterOdd::g(int x)    {
    if ((x%2)!=0)   {
        return true;
    }   else    {
        return false;
    }
}
class FilterNonPositive : public FilterGeneric  {
private:
    bool g(int x);
};
bool FilterNonPositive::g(int x)    {
    if (x<0)   {
        return true;
    }   else    {
        return false;
    }
}
class FilterForTwoDigitPositive : public FilterGeneric  {
private:
    bool g(int x);
};
bool FilterForTwoDigitPositive::g(int x)    {
    if (x>=10)   {
        return true;
    }   else    {
        return false;
    }
}
int main()  {
    std::vector<int> v;
    std::vector<int>::iterator it=v.begin();
    for (int i=0;i<20;i++)  {
        v.push_back(pow(-1,i)*i);
    }
    std::cout<<std::endl;
    FilterNonPositive fnp;
    FilterForTwoDigitPositive ftd;
    FilterGeneric *f1=&fnp;
    FilterGeneric *f2=&ftd;
    std::vector<int> r1;
    std::vector<int> r2;
    r1=f1->filter(v,it);
    for (it=r1.begin();it!=r1.end();it++)   {
        std::cout<<*it<<" ";
    }
    r2=f2->filter(v,it);
    for (it=r2.begin();it!=r2.end();it++)   {
        std::cout<<*it<<" ";
    }
}

错误在这里:

std::vector<int> v;
std::vector<int>::iterator it=v.begin();
for (int i=0;i<20;i++)  {
    v.push_back(pow(-1,i)*i);  // invalidates all iterators into "v"
}
...
r1=f1->filter(v,it);  // using invalidated "it"

问题在于,如果需要调整向量大小,则v.push_back() 无效所有迭代器都进入向量。从文档:

如果新的size()大于容量(),则所有迭代器和参考(包括过去的迭代器)都是无效的。否则,只有过去的迭代器被无效。

通过移动it初始化在v进行了核对之后,也有其他错误。

也有其他错误。

如果您使用g++构建,则可以使用-D_GLIBCXX_DEBUG来帮助您找到此类错误。

相关内容

  • 没有找到相关文章

最新更新