声明向量时

时间:2017-04-14 10:54:31

标签: c++ stl segmentation-fault

我正在编写一个包含两个类的程序:

 class Sequence {

    protected:
    vector<int> seq_;

    public:
    Sequence(){
            for(int i=0; i<16;i++)
                    seq_.push_back(0);
    };
    Sequence(int a, int b,int c){
            for(int i=0; i<16; i++)
                    seq_.push_back(a*i+b*i*i+c*i*i*i);
    };
    Sequence(const Sequence & myseq){
            for(int i=0; i<16;i++)
                    seq_[i]=myseq.Get_i(i);
    };

    int Get_i(int i)const{
            return seq_[i];
    };

    void Print() const { 
            for(int i=0; i<16; i++)
                    cout<<seq_[i]<<endl;
    };

    int operator*(Sequence & myseq) const {
            int sum=0;
            for(int i=0; i<16;i++)
                    sum+=seq_[i]*myseq.seq_[i];
            return sum;
    };

    void operator=(Sequence & myseq) {
            for(int i=0; i<16; i++)
                    seq_[i]=myseq.seq_[i];
    };

};

这第一类专门用于包含序列并重载一些基本运算符。另一方面,下面包含对应于数字的二进制序列(如果默认构造函数接收到调用,则包含随机二进制序列)。

 class Binary : public Sequence {

    private:

    public:
    Binary(){
            for(int i=0; i<16; i++)
                    seq_.push_back(round(drand48()));
    };

    Binary(int num){
            double prec=num; double last=0;
            for(int i=16; i>=0; i--){
                            prec=prec-last;
                            if(int(prec/pow(2,i))==0){
                                    seq_.push_back(0);
                                    last=0;
                            }else{
                                    seq_.push_back(1);
                                    last=pow(2,i);
                            }
            }
    };

    Binary  not_ () {
            Binary mybin;
            for(int i=0; i<16; i++){
                    if( seq_[i]==1){
                            mybin.seq_[i]=0;
                    }else{  
                            mybin.seq_[i]=1;
                    };
            };
            return mybin;
    };

    int cost (Sequence myseq){
            int k=myseq*(*this)-(Binary::not_())*myseq;
            return k;
    };



  };

问题在于我只是定义了一个向量的分段错误:

 vector<Binary> mybins (pow(2,16));

我运行GDB并且它停留在复制构造函数中:

 Sequence(const Sequence & )

我想知道你是否可以给我任何帮助来找到错误并向我解释。我猜它与我对标准库如何工作的了解不足有关! 谢谢你的时间。

2 个答案:

答案 0 :(得分:2)

=ROUND(value,sigfigs-(1+INT(LOG10(ABS(value)))))

这是一个构造函数。它正在构建一个新对象。

Sequence(const Sequence & myseq){

for(int i=0; i<16;i++) seq_[i]=myseq.Get_i(i); 成员是最初为空的向量。尝试在向量中设置不存在的值是未定义的行为,以及崩溃的原因。您的其他构造函数正确地使用seq_将新值插入向量中。这也应该在这里完成。

答案 1 :(得分:0)

所有构造函数都以空seq_开头并正确使用push_back来增长它并向其中添加元素...除了复制构造函数,它也以#{1}开头但是使用seq_代替。因此,它访问的元素不在向量中,为您提供未定义的行为。

要正确解决此问题,请完全删除复制构造函数。然后编译器将为您生成一个,这将完成您所需要的。作为奖励,它还会生成移动构造函数。