C++ STL排序不工作 (i=0;i
我有那个小片段。我输入“1200 1500 1800”,它应该给我中间值-1500。然而,它输出的是1200,最小的值 我要做的是使用STL的sort()对向量进行排序,然后打印值[1],这是中间值 然而,sort()似乎根本不起作用,前后打印的向量是一样的 我声明我的向量为: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
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
的函数。