Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL排序不工作 (i=0;i_C++_Sorting_Stl - Fatal编程技术网

C++ STL排序不工作 (i=0;i

C++ STL排序不工作 (i=0;i,c++,sorting,stl,C++,Sorting,Stl,我有那个小片段。我输入“1200 1500 1800”,它应该给我中间值-1500。然而,它输出的是1200,最小的值 我要做的是使用STL的sort()对向量进行排序,然后打印值[1],这是中间值 然而,sort()似乎根本不起作用,前后打印的向量是一样的 我声明我的向量为: for (i = 0; i < t; i++) { values.clear(); scanf("%d %d %d", &values[0], &values[1], &value

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

我要做的是使用STL的sort()对向量进行排序,然后打印值[1],这是中间值

然而,sort()似乎根本不起作用,前后打印的向量是一样的

我声明我的向量为:

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]);
}
向量值(3);
我试图用
向量值声明它然后
向后推(0)
三次,然后打开

我想知道为什么第一种方法不起作用

vector<int> values (3);
这将清除
,使其不再包含任何元素。试图访问任何元素都会导致未定义的行为,而
std::sort
只会对空的数字序列进行排序

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

销毁
a
中的所有元素。使引用
a
元素的所有引用、指针和迭代器无效,并可能使结束迭代器的过去部分无效。
post:
a.empty()
返回true


您的程序具有未定义的行为

要修复它,只需删除以下行:

values.clear();
values.clear();
事实上,上面这一行所做的是从向量中删除所有元素。那么这一行,

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

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

表达式:
a[n]

返回类型:引用<代码>常数参考
常数
a

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

这意味着通过这样做:

scanf("%d %d %d", &values[0], &values[1], &values[2]);
                   ^^^^^^^^^   ^^^^^^^^^   ^^^^^^^^^
values[0]
实际上,您正在这样做:

scanf("%d %d %d", &values[0], &values[1], &values[2]);
                   ^^^^^^^^^   ^^^^^^^^^   ^^^^^^^^^
values[0]
这里对
values.begin()
的调用将向数组中的第一个元素返回一个迭代器。由于向量中没有元素(§23.2.1/6),因此调用
values.begin()
相当于调用
values.end()

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

因此,在您的案例中,
值[0]
实际上相当于:

*(values.begin() + 0)
*(values.end() + 0)
这反过来相当于:

*(values.begin() + 0)
*(values.end() + 0)

换句话说,您正在解引用一个迭代器,该迭代器指向容器中最后一个元素之外的位置。这是未定义的行为,当然这同样适用于
值[1]
值[2]
当清除
向量时,将大小设置为0。
scanf
行通常不会崩溃,因为
vector
通常会在存储读取值的位置预先分配一些存储。结果是,当调用
sort
时,
begin()
end()
将相等


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

尝试用
值清除实际存在的元素。clear()实际上是从向量中完全删除它们。这会使
begin()
end()
相等,导致排序无效(并且获取各个元素地址的输入具有未定义的行为)


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

我认为\u middian标题中的函数更容易

*(values.end())

你的意思是
std::n\u元素
。在(标准库的标准部分)中没有类似于
\u median
的函数。