如果向量<int>按顺序添加到向量中,我是否需要对向量进行排序?

Do I need to sort a vector<int> if they were added to the vector in order?

本文关键字:向量 是否 排序 gt int lt 顺序 如果 添加      更新时间:2023-10-16

如果项目是从已经排序的文件中按顺序读取的,我是否需要对向量进行排序?如果没有必要的话,我不想招致绩效罚款。作为参考,这是我用来构建它的东西,每个项目都是按顺序读取的

根据@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;
}

在这种情况下,每个元素都会根据最后一个元素进行检查,以确保它至少同样大。如果没有,则标记向量进行排序。

这样一来,检查成本最低,但它使您能够处理不符合规则的数据。