从向量中删除,通过引用传递

基思·麦迪逊

我正在尝试按索引擦除向量中的元素,该向量已通过引用传递给某些函数。通常,我会这样:

void erase_element(vector<int> &my_vector, int index){
    my_vector.erase(my_vector.begin() + index);
}

void make_vector(){
    vector<int> my_vector = {1,2,3,4,5};
    erase_element(my_vector, 3);
}

而且,的确,为了检查我的理智,我运行了它并且它起作用了。

但是由于某种原因,代码抛出segfault有问题的线路似乎是,其中从矢量擦除元件a1a2a3

我的代码:

double maximum(double a, double b, double c) 
{ 
   return max(max(a, b), c); 
} 
  
 
double minimum(double a, double b, double c) 
{ 
   return min(min(a, b), c); 
} 

void findClosestTriplet(vector<double> &a1, vector<double> &a2, vector<double> &a3, TH2 *histo){

    double res_min, res_max, res_mid;
    int i = 0, j = 0, k = 0;

    int a1Size = a1.size();
    int a2Size = a2.size();
    int a3Size = a3.size();

    double diff = DBL_MAX;
    while(i < a1Size && j < a2Size && k < a3Size){

        double sum = a1[i] + a2[j] + a3[k];

        double min = minimum(a1[i], a2[j], a3[k]);
        double max = maximum(a1[i], a2[j], a3[k]);

        if(min == a1[i]){
            ++i;
        } else if (min == a2[j]){
            ++j;
        } else {
            ++k;
        }

        if (diff > (max-min)){ 
                    diff = max - min; 
                    res_max = max; 
                    res_mid = sum - (max + min); 
                    res_min = min; 
            } 

    }


    a1.erase(a1.begin() + i); a2.erase(a2.begin() + j); a3.erase(a3.begin() + k);

}

void minimizer(){

    TH2 *histo = new TH2D("Histo","Histo",1000,-0.1,0.1,1000,-0.1,0.1);

    ROOT::RDataFrame f1("D","data1.root");
    ROOT::RDataFrame f2("D","data2.root");
    ROOT::RDataFrame f3("D","data3.root");

    vector<double> a1,a2,a3;
    a1.reserve(1E+6); a2.reserve(1E+6); a3.reserve(1E+6);

    f1.Foreach([&](double tstamp){a1.push_back(tstamp);},{"UNIX"});
    f2.Foreach([&](double tstamp){a2.push_back(tstamp);},{"UNIX"});
    f3.Foreach([&](double tstamp){a3.push_back(tstamp);},{"UNIX"});

    int maxiter = std::max(std::max(a1.size(), a2.size()), a3.size());

//  std::ios_base::sync_with_stdio(false);
//  std::cin.tie(NULL);

    for(int i = 0; i < maxiter; ++i){
        findClosestTriplet(a1,a2,a3,histo);

    }

}

我试图做一个最小的可复制示例,但是失败了。有效:

void findClosestTriplet(vector<double> &a1, vector<double> &a2, vector<double> &a3, TH2 *histo){

        int i = 1; int j = 2; int k = 3;

        a1.erase(a1.begin() + i); a2.erase(a2.begin() + j); a3.erase(a3.begin() + k);

}

void minimizer(){

        TH2 *histo = new TH2D("Histo","Histo",1000,-0.1,0.1,1000,-0.1,0.1);

        ROOT::RDataFrame f1("D","data1.root");
        ROOT::RDataFrame f2("D","data2.root");
        ROOT::RDataFrame f3("D","data3.root");

        vector<double> a1,a2,a3;
        a1.reserve(1E+6); a2.reserve(1E+6); a3.reserve(1E+6);

        f1.Foreach([&](double tstamp){a1.push_back(tstamp);},{"UNIX"});
        f2.Foreach([&](double tstamp){a2.push_back(tstamp);},{"UNIX"});
        f3.Foreach([&](double tstamp){a3.push_back(tstamp);},{"UNIX"});

        for(int i = 0; i < a1.size(); ++i){
                findClosestTriplet(a1,a2,a3,histo);
                std::cout << i << "\n";
        }

        histo->Draw("colz");

}

向量a1a2a3在两种情况下都是相同的。整数i,j,k不在循环中,因此似乎无关。而且,我知道在发生错误时i,j,k它们的大小不大于a1,a2,a3,也不小于0

我知道我一定在做蠢事。但是呢

1201程序警报

之一的ijk将是各自的容器的大小。对该元素的擦除调用将等同于a.erase(a.begin() + a.size())a.erase(a.end())传递给的迭代器erase必须有效且可取消引用。结束迭代器不可引用,不能传递给erase

erase呼叫中使用索引之前,必须检查索引是否在范围内

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过引用传递unique_ptrs的向量

来自分类Dev

返回向量或通过引用传递

来自分类Dev

通过引用或指针正确传递向量

来自分类Dev

在Haskell中通过引用传递?

来自分类Dev

在python中通过引用传递

来自分类Dev

在__clone中通过引用传递

来自分类Dev

在C ++中通过引用传递?

来自分类Dev

通过引用函数传递向量,但更改不会持久

来自分类Dev

通过引用函数传递向量,但更改不会持久

来自分类Dev

通过引用传递向量然后调用清除

来自分类Dev

带有通过引用传递的向量的尾递归

来自分类常见问题

在Go中,地图是通过值传递还是通过引用传递?

来自分类Dev

从向量c ++中删除对象,尝试引用已删除的函数

来自分类Dev

通过引用分配向量

来自分类Dev

在C中通过const引用传递

来自分类Dev

在C中通过引用传递多维数组

来自分类Dev

在C ++中通过引用传递对象

来自分类Dev

在咖喱参数中通过引用传递参数

来自分类Dev

在C中通过引用传递数组

来自分类Dev

在python中通过引用传递整数

来自分类Dev

AngularJS,在指令中通过引用传递对象

来自分类Dev

如何在Matlab中通过引用传递?

来自分类Dev

通过C ++中的引用选项传递

来自分类Dev

通过Red例程中的引用传递

来自分类Dev

C ++通过构造函数中的引用传递

来自分类Dev

为什么在PHP中通过引用传递?

来自分类Dev

通过引用在C中传递指针

来自分类Dev

在Kotlin中通过引用传递值

来自分类Dev

在Java中通过引用传递类型