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

时间:2012-01-25 02:02:16

标签: c++ vector

如果从已经排序的文件中读取项目,是否需要对矢量进行排序?如果不必要,我不想承担性能损失。作为参考,我正在使用它来构建它,并且每个项目都在按顺序读取。

  

在@ dribeas&#39;之后编辑评论

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;
}

3 个答案:

答案 0 :(得分:5)

不,您不需要对矢量进行排序。 push_back明确地将元素添加到结尾

请注意,您的API正在接收elems并返回它(通过引用)。矢量已包含的任何内容会发生什么?

答案 1 :(得分:4)

如果您询问std::vector是否会保留将项目推送到其上的顺序,那么是。这是合同的一部分。

答案 2 :(得分:3)

如果启动时矢量为空(原始示例代码中不清楚),并且按照您想要的顺序添加了项目,不,您不需要排序,因为{ {3}}将项目推送到向量的后面(结束):

  

在向量的末尾添加一个新元素,在其当前的最后一个元素之后。


在编辑之后,列表非空开始的可能性现在已经消失。这部分仍然代表原始问题,这是可能的。

如果矢量开头并非空,那么即使您按顺序添加了新内容,其中的内容也可能会出现故障。

如果你想确保它的排序,但是除非绝对必要,否则你可以避免排序,你可以在添加之后作为后续步骤进行排序,例如:

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;
}

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

通过这种方式,检查成本最低,但它使您能够处理不符合规则的数据。