簡體   English   中英

STL排序不起作用

[英]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的元素的引用,指針和迭代器無效,並且可能使過去的迭代器無效。
posta.empty()返回true

我認為<算法>標頭中的__median函數更容易。

med = __median(a, b, c);

當清除vector ,會將大小設置為scanf行通常不會崩潰,因為vector通常會預先分配一些存儲讀取值的存儲空間。 結果是,當您調用sortbegin()end()將相等。

您可以嘗試將這些值讀入臨時變量,也可以在讀取子表達式之前調用resize(3)

您嘗試使用values.clear();清除實際的現有元素values.clear(); 實際上是將它們從向量中完全刪除。 這具有使begin()end()相等的作用,從而使排序無效(以及使各個元素的地址進入的輸入具有未定義的行為)。

我認為您真正想做的是確保向量中沒有太多元素,因此values.resize(3) clear使用resizevalues.resize(3)values.resize(3)清除多余的元素或增加其大小。如果當前較小,則向量為三。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM