【问题标题】:error: assignment of read-only location ‘* __result’错误:分配只读位置‘* __result’
【发布时间】:2021-01-31 18:19:03
【问题描述】:

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

/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”。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 这并没有解决问题,但if (x.first &lt; y.first) return true; else return false; 通常写成return x.first &lt; y.first;
  • 是的,这是一种更好的方法。谢谢@PeteBecker :)
  • 作为新用户,请拨打tour阅读How to Ask。关于您的问题,您还应该提取 minimal reproducible example 并将其包含在您的问题中,在剥离真正不需要重现问题的所有内容之后。

标签: c++ algorithm merge stl


【解决方案1】:

您好像误会了std::merge 的第五个参数的用途。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2012-08-28
    • 1970-01-01
    相关资源
    最近更新 更多