[英]STL sort not working
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()對向量進行排序,然后打印出值[1],這是中間值。
但是,sort()似乎根本不起作用,前后的打印矢量是同一回事。
我用以下方法聲明我的向量:
vector<int> values (3);
我試圖用vector<int> values;
聲明它vector<int> values;
然后push_back(0)
三次。
我想知道為什么它不首先起作用。
您的程序具有未定義的行為 。
為了修復它,只需刪除此行:
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]
返回類型 :參考; 常量
a
const_reference
操作語義 :
*(a.begin() + n)
這意味着通過執行以下操作:
values[0]
您實際上是在這樣做:
*(values.begin() + 0)
這里對values.begin()
的調用返回一個迭代器,該迭代器返回數組中的第一個元素。 由於向量中沒有元素(第23.2.1 / 6節),因此對values.begin()
的調用等效於對values.end()
的調用:
begin()
返回引用容器中第一個元素的迭代器。end()
返回一個迭代器,該迭代器是容器的過去值。 如果容器為空,則begin() == end()
;
因此,您所用的values[0]
實際上等效於此:
*(values.end() + 0)
這等效於此:
*(values.end())
換句話說,您要取消引用指向容器中最后一個元素之外的位置的迭代器。 這是未定義的行為,這當然也適用於values[1]
和values[2]
。
values.clear();
這將清除values
,使其不再包含任何元素。 嘗試訪問任何元素都將導致未定義的行為,而std::sort
將僅對空數字序列進行排序。
a.clear()
的定義a.clear()
其中a
是序列容器)是:
銷毀元素中
a
所有元素。 使所有引用a
的元素的引用,指針和迭代器無效,並且可能使過去的迭代器無效。
post :a.empty()
返回true
我認為<算法>標頭中的__median函數更容易。
med = __median(a, b, c);
當清除vector
,會將大小設置為scanf
行通常不會崩潰,因為vector
通常會預先分配一些存儲讀取值的存儲空間。 結果是,當您調用sort
, begin()
和end()
將相等。
您可以嘗試將這些值讀入臨時變量,也可以在讀取子表達式之前調用resize(3)
。
您嘗試使用values.clear();
清除實際的現有元素values.clear();
實際上是將它們從向量中完全刪除。 這具有使begin()
和end()
相等的作用,從而使排序無效(以及使各個元素的地址進入的輸入具有未定義的行為)。
我認為您真正想做的是確保向量中沒有太多元素,因此values.resize(3)
clear
使用resize
: values.resize(3)
, values.resize(3)
清除多余的元素或增加其大小。如果當前較小,則向量為三。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.