c++ 使用Stack〈pair〈int,int>>合并重叠区间

bmvo0sr5  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(161)

我在合并重叠的区间
五、十二、一、八、十四、十九、二十二、二十八、二十五、二十七、二十七
所以我使用的逻辑是pair〈int,int〉template但是我不能把pair元素压入Stack〈pair〈int,int〉〉,因为我压入的是(&int,&int)而不是(int,int)

#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
void mergeOverlappingIntervals(vector<vector<int>> &arr){
    vector<pair<int,int>> v;
    for(int i=0;i<arr.size();i++){
        v.push_back(make_pair(arr[i][0],arr[i][1]));
    }
    sort(v.begin(),v.end());
    // for(auto x:v){
    //     cout<<x.first<<" "<<x.second<<endl;
    // }
    stack<pair<int,int>> st;
    st.push(v[0].first,v[0].second);
    for(int i=1;i<v.size();i++){
        int top = st.top();
        if(v[i].first <= top.second){
            top.second = max(top.second,v[i].second);
        }
        st.push(v[i].first,v[i].second);
    }
    while(!st.empty()){
        int top = st.top();
        cout<<top.fist << " " << top.second<<endl;
        st.pop();
    }
}

int main() {
    int n;
    cin>>n;
    vector<vector<int>> arr(n, vector<int>(2,0));
    for(int i=0;i<n;i++){
        cin>>arr[i][0];
        cin>>arr[i][1];
    }
    mergeOverlappingIntervals(arr);
    return 0;
}
l7wslrjt

l7wslrjt1#

你一定是误解了错误信息。由于你没有包括它,我无法向你解释。
当我尝试编译时,我得到以下错误消息:

<source>: In function 'void mergeOverlappingIntervals(std::vector<std::vector<int> >&)':
<source>:16:12: error: no matching function for call to 'std::stack<std::pair<int, int> >::push(int&, int&)'
   16 |     st.push(v[0].first,v[0].second);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/stack:61,
                 from <source>:4:
/opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_stack.h:260:7: note: candidate: 'void std::stack<_Tp, _Sequence>::push(const value_type&) [with _Tp = std::pair<int, int>; _Sequence = std::deque<std::pair<int, int>, std::allocator<std::pair<int, int> > >; value_type = std::pair<int, int>]'
  260 |       push(const value_type& __x)
      |       ^~~~

[...]

这是因为std::stack< std::pair<int,int> >::push只有一个参数,而不是两个。https://en.cppreference.com/w/cpp/container/stack/push
你可以使用std::make_pair,就像你在压入向量时一样,实际上压入向量类似于压入堆栈,尽管在这两种情况下你都不需要std::make_pair,只需要添加一对{}来构造这个对:

st.push({v[i].first,v[i].second});

或者你也可以使用emplace,它接受参数,然后转发给elements构造函数。

相关问题