簡體   English   中英

我需要對矢量進行排序嗎? <int> 如果它們按順序添加到向量中?

[英]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.

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