假设我有以下向量:
向量是成对的向量,我们基于第一个元素进行比较。
[(1,0),(0,1),(3,2),(6,3),(2,4),(4,5),(7,6),(5,7)]
我想删除特定范围内的所有元素,但最大的除外。
例如,如果范围是$ l = 2 $和$ r = 5 $,则输出:
[(1,0),(0,1),(6,3),(7,6),(5,7)]
现在,如果我们再次对输出数组执行以下操作:$ l = 1 $,$ r = 4 $,则输出:
[(1,0),(7,6)]
我发现这对我很有用,但是我不知道如何使其成对使用。
这是我的尝试:
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");
}
对于以下输入:
8
1 0 5 6 2 3 7 4
1 3
这是输出:
[(1,0)(5,2)(6,3)(3,5)(7,6)(4,7)]
但这应该是
[(1,0)(6,3)(3,5)(7,6)(4,7)]
另外,对于某些输入,我会遇到段错误,那么我该如何防范呢?
可能你想要这个
#include <iostream>
#include <vector>
using namespace std;
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;
}
}
int p=l;
for (int i = l; i <= r;i++ ) {
if (vector_of_pairs[p].first != max_in_range) {
vector_of_pairs.erase(vector_of_pairs.begin()+p);
}
else p++;
}
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");
}
获取正确的输出:
[(1,0)(6,3)(2,4)(3,5)(7,6)(4,7)]
说明:当您删除矢量中的项目时,在删除的元素之后出现的项目的索引将减少1。因此,在从l到r的ith循环中,您不应删除vec.begin()+ i元素,而应删除vec。 begin()+ l项目,直到找到最大元素为止;找到最大元素后,删除vec.begin()+ l + 1元素。
希望能帮助到你。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句