【发布时间】:2017-09-02 00:48:27
【问题描述】:
假设我有以下向量:
向量是成对的向量,我们根据第一个元素进行比较。
[(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)]
我找到了this,我认为它在这里很有用,但我不知道如何让它对成对起作用。
这是我的尝试:
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)]
另外,对于某些输入,我会遇到段错误,那么我该如何防范呢?
【问题讨论】:
-
请在程序本身中发布/硬编码输入。无需继续在键盘上输入。
-
您能否详细说明@PaulMcKenzie?你的意思是我应该在代码中包含输入/输出示例?
-
@PaulMcKenzie std::vector> 输入 { std::make_pair( 1 , 0 ) , std::make_pair( 0 , 1 ) , std:: make_pair( 3 , 2 ) , std::make_pair( 6 , 3 ) , std::make_pair( 2 , 4 ) , std::make_pair( 4 , 5 ) , std::make_pair( 7 , 6 ) , std:: make_pair( 5 , 7 ) };
-
@user6005857:喜欢this。
-
当你擦除时,未来的
begin() + i将不是你所期望的。