繁体   English   中英

错误:只读位置“* __result”的分配

[英]error: assignment of read-only location ‘* __result’

在编译给定代码时,我收到以下错误消息:

/usr/include/c++/9.2.0/bits/stl_algo.h: In instantiation of ‘_OutputIterator 
 std::__merge(_InputIterator1, _InputIterator1, _InputIterator2, _InputIterator2, _OutputIterator, 
 _Compare) [with _InputIterator1 = __gnu_cxx::__normal_iterator<std::pair<int, int>*, 
 std::vector<std::pair<int, int> > >; _InputIterator2 = __gnu_cxx::__normal_iterator<std::pair<int, 
 int>*, std::vector<std::pair<int, int> > >; _OutputIterator = bool (*)(std::pair<int, int>, 
 std::pair<int, int>); _Compare = __gnu_cxx::__ops::_Iter_less_iter]’:
 /usr/include/c++/9.2.0/bits/stl_algo.h:4929:37:   required from ‘_OIter std::merge(_IIter1, _IIter1, 
 _IIter2, _IIter2, _OIter) [with _IIter1 = __gnu_cxx::__normal_iterator<std::pair<int, int>*, 
 std::vector<std::pair<int, int> > >; _IIter2 = __gnu_cxx::__normal_iterator<std::pair<int, int>*, 
 std::vector<std::pair<int, int> > >; _OIter = bool (*)(std::pair<int, int>, std::pair<int, int>)]’
 jdoodle.cpp:61:81:   required from here
 /usr/include/c++/9.2.0/bits/stl_algo.h:4874:18: error: assignment of read-only location ‘* __result’
  4874 |        *__result = *__first2;
       |        ~~~~~~~~~~^~~~~~~~~~~
 /usr/include/c++/9.2.0/bits/stl_algo.h:4879:18: error: assignment of read-only location ‘* __result’
  4879 |        *__result = *__first1;
       |        ~~~~~~~~~~^~~~~~~~~~~

以下是代码:

#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <utility>
#include <cfloat>

using namespace std;

struct Node
{
    int left;
    int right;
    double dist;
};


bool x_sort(pair<int,int> x,pair<int,int> y)
{
    if(x.first<y.first)
        return true;
    return false;
}

bool y_sort(pair<int,int> x,pair<int,int> y)
{
    if(x.second<y.second)
        return true;
    return false;
}   


Node closest_dist(vector<pair<int,int>> arr,int low,int high)
{
    Node x;
    double min_dist=DBL_MAX;
    if(high-low+1<=3)
    {
        for(int i=low;i<=high;i++)
        {
            for(int j=i+1;j<=high;j++)
            {
                double dist=sqrt(pow((arr[i].first-arr[j].first),2)+pow((arr[i].second-arr[j].second),2));
                if(dist<min_dist)
                {
                    min_dist=dist;
                    x.left=i;
                    x.right=j;
                    x.dist=min_dist;
                }
            }
        }
    }


    int mid=low+(high-low)/2;
    Node x1=closest_dist(arr,low,mid);
    Node x2=closest_dist(arr,mid+1,high);
    double min_dist_now=min(x1.dist,x2.dist);

    merge(arr.begin()+low,arr.begin()+mid,arr.begin()+mid+1,arr.begin()+high,y_sort); //line which gives the error(most probably)

    vector<pair<int,int>> strip;

    for(int i=low;i<=high;i++)
        if((abs(arr[mid].first-arr[i].first)<min_dist_now))
            strip.push_back(arr[i]);
    
    for(int i=0;i<strip.size()-7;i++)
    {
        for(int j=i+1;j<=i+7&&j<strip.size();j++)
        {
            double dist=sqrt(pow((arr[i].first-arr[j].first),2)+pow((arr[i].second-arr[j].second),2));
            if(dist<min_dist_now)
            {
                min_dist_now=min_dist;
                x.left=i;
                x.right=j;
                x.dist=min_dist;
            }
        }
    }
    return x;
    

}

int main()
{
    int n;
    cin>>n;
    vector<pair<int,int>> arr;
    for(int i=0;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        arr.push_back(make_pair(x,y));
    }
    sort(arr.begin(),arr.end(),x_sort);
    for(int i=0;i<n;i++)
    {
        cout<<arr[i].first<<" "<<arr[i].second;
        cout<<"\n";
    }

    Node ans=closest_dist(arr,0,n-1);
    cout<<ans.left<<" "<<ans.right<<" "<<ans.dist<<"\n";
    return 0;
    
}

我已经编写了代码作为问题的解决方案https://www.spoj.com/problems/CLOPPAIR/我是 STL 的新手,在找到相同错误的解决方案时,大多数实现都误用了关键字“const”导致了这个错误。 但是,就我而言,没有使用“const”。 有人可以帮我解决这个问题吗?

似乎您误解了std::merge的第五个参数的用途。

该参数应该是一个迭代器,它告诉编译器在哪里放置合并的数据。 但是,您已经提供了一个函数。

看起来您正在尝试提供自定义排序条件,但这将是std::merge第六个参数。

https://en.cppreference.com/w/cpp/algorithm/merge

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM