【发布时间】:2020-11-15 19:46:39
【问题描述】:
我是 C++14 的用户。 当我使用带有比较功能的 std::vector 对二维数组进行排序时。 但它并没有像我想的那样起作用,最后我发现了一些奇怪的东西。 让我们看看下面的代码。
using namespace std;
int n;
vector<vector<int>> v;
bool cmp(const vector<int>& l, const vector<int>& r){
return l[1] < r[1] ? true : l[0] < r[0];
}
int main() {
scanf("%d", &n);
v.resize(n, vector<int>(2));
for (int i = 0; i < n; ++i)
scanf("%d %d", &v[i][0], &v[i][1]);
sort(v.begin(), v.end(), cmp);
for(int i = 0; i < n; ++i)
cout << v[i][0] << ' ' << v[i][1] << endl;
return 0;
}
(请忽略我使用scanf 和cout。我正在解决问题。)
这是输入
11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14
我希望输出与没有n 的输入完全相同,但输出是
0 6
1 4
2 13
3 5
3 8
5 7
5 9
6 10
8 11
8 12
12 14
我换的时候也发现了奇怪的地方
v.resize(n, vector<int>(2);
到
v.reserve(n);
for(int i = 0; i < n; ++i)
v[i].reserve(2);
reserve 使代码按我的意愿正确。
我想我知道reserve 和resize vector 的不同之处,但缺少一些东西......
你能教我缺少什么吗..?
【问题讨论】:
-
您的代码未编译,因为
meeting未声明。 -
"
reserve使代码如我所愿" - 保留不会将元素添加到向量中,只会添加原始内存。您正在与不存在的向量进行交互。 -
您的
cmp实现不遵守严格的弱排序(我不认为)。这是未定义的行为。 -
resize 改变向量的大小,reserve 不会。那就是你缺少的东西。保留为向量分配更多空间,但不会改变它的大小。
-
谢谢大家。我在你的答案的逻辑中发现了错误。