除了特定范围内的最大元素外,如何擦除矢量中的所有元素?

use*_*857 2 c++ vector

假设我有以下向量:

向量是对的向量,我们基于第一个元素进行比较.

[(1,0),(0,1),(3,2),(6,3),(2,4),(4,5),(7,6),(5,7)]
Run Code Online (Sandbox Code Playgroud)

我想擦除除最大值之外的特定范围内的所有元素.

例如,如果范围是$ l = 2 $和$ r = 5 $,那么输出:

[(1,0),(0,1),(6,3),(7,6),(5,7)]
Run Code Online (Sandbox Code Playgroud)

现在,如果我们再次对$ l = 1 $,$ r = 4 $的输出数组执行此操作,那么输出:

[(1,0),(7,6)]
Run Code Online (Sandbox Code Playgroud)

我发现这个我认为在这里很有用,但我不知道如何使它成对使用.

这是我的尝试:

int main(int argc, char const *argv[]) {
    int N;
    cin >> N;
    vector< pair<int,int> > vector_of_pairs(N);

    for (int i = 0; i < N; i++) {
        int input;
        cin >> input;
        vector_of_pairs[i] = make_pair(input, i);
    }

    int l, r;
    cin >> l >> r;

    int max_in_range = vector_of_pairs[l].first;

    for (int i = l+1; i <= r; i++) {
        if (vector_of_pairs[i].first > max_in_range) {
            max_in_range = vector_of_pairs[i].first;
        }
    }

    for (int i = l; i <= r; i++) {
        if (vector_of_pairs[i].first != max_in_range) {
            vector_of_pairs.erase(vector_of_pairs.begin() + i);
        }
    }

    printf("[");
    for(int i = 0; i < vector_of_pairs.size(); i++) {
        printf("(%d,%d)", vector_of_pairs[i].first, vector_of_pairs[i].second);
    }
    printf("]\n");
}
Run Code Online (Sandbox Code Playgroud)

对于以下输入:

8              
1 0 5 6 2 3 7 4 
1 3
Run Code Online (Sandbox Code Playgroud)

这是输出:

[(1,0)(5,2)(6,3)(3,5)(7,6)(4,7)]
Run Code Online (Sandbox Code Playgroud)

但它应该是

[(1,0)(6,3)(3,5)(7,6)(4,7)]
Run Code Online (Sandbox Code Playgroud)

此外,对于某些输入,我会遇到seg故障,那么我怎样才能安全防范?

Jar*_*d42 6

擦除抢救中的成语:

auto begin = v.begin() + l;
auto end = v.begin() + r + 1;
auto max_value = *std::max_element(begin, end);
v.erase(std::remove_if(begin, end,
                       [&](const auto& p) {return p.first != max_value.first; }),
        end);
Run Code Online (Sandbox Code Playgroud)

演示