0
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() 对向量进行排序,然后打印 values[1],这是中间值。

但是, sort() 似乎根本不起作用,之前和之后的打印向量是一样的。

我声明我的向量:

vector<int> values (3);

我试图用vector<int> values;然后push_back(0)三遍和它来声明它。

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

4

5 回答 5

6

你的程序有未定义的行为

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

values.clear();

实际上,上面这行所做的就是从 vector 中删除所有元素。然后,这一行:

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

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

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

表达式a[n]

返回类型:参考;const_reference为常数a

操作语义*(a.begin() + n)

这意味着通过这样做:

values[0]

你实际上是在这样做:

*(values.begin() + 0)

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

begin()返回一个引用容器中第一个元素的迭代器。end()返回一个迭代器,它是容器的结束值。如果容器是空的,那么begin() == end()

因此,values[0]在您的情况下实际上等同于:

*(values.end() + 0)

这又相当于:

*(values.end())

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

于 2013-03-24T14:15:00.647 回答
5
values.clear();

这将清除values,使其不再包含任何元素。尝试访问任何元素将导致未定义的行为,并且std::sort只会对空的数字序列进行排序。

a.clear()wherea是一个序列容器的定义是:

销毁a. 使所有引用的元素的引用、指针和迭代器失效,a并且可能使过去的迭代器失效。
帖子a.empty()返回真

于 2013-03-24T14:14:28.920 回答
1

我认为 < algorithm >标头中的__median函数更容易。

med = __median(a, b, c);
于 2013-03-24T14:22:04.930 回答
0

当您清除时,vector您将大小设置为 0。该scanf行通常不会崩溃,因为vector通常会预先分配一些存储读取值的存储空间。结果是,当您调用sort, 时,begin()end()将相等。

您可以尝试将值读取到临时变量中,或者resize(3)在读取值之前调用。

于 2013-03-24T14:19:42.053 回答
0

您尝试清除实际存在的元素values.clear();实际上是从向量中完全删除它们。这具有产生begin()end()相等的效果,导致排序无效(以及您获取各种元素地址的输入具有未定义的行为)。

我认为您真正想要做的是确保向量中没有太多元素,因此不要clear使用resize: values.resize(3),这将具有删除多余元素或将向量的大小增加到三个(如果它当前较小)的效果.

于 2013-03-24T14:21:21.730 回答