简体   繁体   中英

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

On compilation of the given code, I get the following error messages:

/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;
       |        ~~~~~~~~~~^~~~~~~~~~~

Following is the code:

#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;
    
}

I have written the code as a solution to the problem https://www.spoj.com/problems/CLOPPAIR/ I am new to STL and on finding a solution to the same error, most implementations have misused the keyword 'const' that has lead to this error. However, in my case there is no usage of 'const'. Can someone please help me out on this?

Seems you mistook what the fifth parameter for std::merge is for.

That parameter should be an iterator which tells the compiler where to place the merged data. You've supplied a function however.

It looks like you are trying to supply a custom sort criteria, but that would be the sixth parameter to std::merge .

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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