[英]Do I need to sort a vector<int> if they were added to the vector in order?
如果從已經排序的文件中讀入項目,是否需要對矢量進行排序? 如果不必要,我不想承擔性能損失。 作為參考,我正在使用它來構建它,並且每個項目在讀入時都是有序的。
在@dribeas的評論后編輯
std::vector<int> split(const std::string &s, char delim) {
std::vector<int> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(static_cast<int>(atoi(item.c_str())));
}
return elems;
}
不,您不需要對矢量進行排序。 push_back
明確地向末尾添加元素。
請注意,您的API正在接受elems
並返回它(通過引用)。 矢量已包含的任何內容會發生什么?
如果你問std::vector
是否會保留你將項目推送到它上面的順序,那么是的。 這是合同的很大一部分。
如果您在啟動時向量為空 (從原始示例代碼中不清楚)並且項目按您想要的順序添加,則不需要排序,因為push_back
將項目推送到后面 (結束)向量:
在向量的末尾添加一個新元素,在其當前的最后一個元素之后。
在編輯之后,列表非空開始的可能性現在已經消失。 這部分仍然代表原始問題,這是一種可能性。
如果向量不是空的,那么即使你按順序添加了新的東西,那里的東西也可能出現故障。
如果你想確保它已經排序,但是除非絕對必要,否則你可以避免排序,你可以在添加之后作為后續步驟進行排序,例如:
std::vector<int> &split (const std::string &s, char sep, std::vector<int> &vec)
{
std::stringstream ss (s);
std::string item;
while (std::getline (ss, item, sep))
vec.push_back (static_cast<int> (atoi (item.c_str ())));
bool sorted = true;
for (int i = vec.size() - 1; (i > 0) && sorted; i--)
sorted = (vec[i] >= vec[i-1]);
if (!sorted) {
// Sort it here.
}
return vec;
}
這將是對元素的相對快速的掃描,以確定它們是否被排序(並且直到它找到第一個無序組)。
如果沒有排序,它將使用您最喜歡的排序算法(不包括電池)對它們進行排序,否則它將返回。
但是,它仍然可能是最好的假設數據可能不會在你想要的順序到達。 您仍然可以使用類似的方法僅在必要時進行排序,例如:
std::vector<int> split (const std::string &s, char delim) {
std::vector<int> elems;
std::stringstream ss (s);
std::string item;
int lastOne = std::numeric_limits<int>::min ();
bool isSorted = true;
while (std::getline(ss, item, delim)) {
int thisOne = atoi (item.c_str ());
if (thisOne < lastOne) isSorted = false;
elems.push_back (static_cast<int> (thisOne));
lastOne = thisOne;
}
if (!isSorted) {
// Sort it here.
}
return elems;
}
在這種情況下,每個元素都會針對最后一個元素進行檢查,以確保它至少同樣大。 如果不是,則標記向量以進行排序。
有了它,檢查的成本最低,但它使您能夠處理不遵守規則的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.