gpt4 book ai didi

c++ - STL 排序不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 14:41:55 24 4
gpt4 key购买 nike

for (i = 0; i < t; i++)
{
values.clear();

scanf("%d %d %d", &values[0], &values[1], &values[2]);
printf("%d %d %d\n", values[0], values[1], values[2]);
sort(values.begin(), values.end());
printf("%d %d %d\n", values[0], values[1], values[2]);

printf("Case %d: %d\n", i + 1, values[1]);
}

我有那个小片段。我输入“1200 1500 1800”,它应该给我中间值 - 1500。但是,它输出的是最小值 1200。

我所做的是使用 STL 的 sort() 对 vector 进行排序,然后打印 values[1],这是中间值。

但是,sort() 似乎根本不起作用,之前和之后打印的 vector 是一回事。

我声明我的 vector :

vector<int> values (3);

我试图用 vector<int> values; 声明它然后 push_back(0)三遍就可以了。

不过,我想知道为什么它不能以第一种方式工作。

最佳答案

您的程序有未定义的行为

为了修复它,只需删除这一行:

values.clear();

实际上,上面这行代码的作用是从 vector 中删除所有元素。然后,这一行:

scanf("%d %d %d", &values[0], &values[1], &values[2]);
^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^

将尝试访问不存在的元素。与用于关联容器的 operator [] 不同,用于 vector 的 operator [] 不会创建任何新元素。因此,表达式 values[0]values[1]values[2] 都是尝试访问不存在的元素。

根据 C++11 标准的表 101:

Expression: a[n]

Return type: reference; const_reference for constant a

Operational semantics: *(a.begin() + n)

这意味着通过这样做:

values[0]

你实际上是这样做的:

*(values.begin() + 0)

此处对 values.begin() 的调用返回指向数组中第一个元素的迭代器。由于 vector 中没有元素 (§ 23.2.1/6),调用 values.begin() 等同于调用 values.end() :

begin() returns an iterator referring to the first element in the container. end() returns an iterator which is the past-the-end value for the container. If the container is empty, then begin() == end();

因此,values[0] 在您的案例中实际上等同于此:

*(values.end() + 0)

这又等同于:

*(values.end())

换句话说,您正在取消引用指向容器中最后一个元素之外的位置的迭代器。这是未定义的行为,同样适用于 values[1]values[2]

关于c++ - STL 排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15599498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com