C++ 如何在已排序的向量中插入新元素?

cod*_*373 0 c++ vector

我正在创建一个分数表,其中分数存储在向量中。当添加一个新分数并且它比向量中的当前分数更大时,我希望添加该分数(我已经完成了),但随后我希望该分数后面的所有分数基本上向后移动,以便为新分数。

所以基本上我想说的是,当一个新元素添加到 Vector 中时,我希望该新元素后面的所有元素基本上都被推回,但我无法找到一种方法来做到这一点。

我想知道是否有人有想法?

编辑: 为了让我更清楚我想要什么。假设您有 10 个不同的分数,如下所示:

500 400 385 350 300 265 200 100 50 20
Run Code Online (Sandbox Code Playgroud)

我想向这个数组添加一个新分数,它等于 425。所以我想要发生的是将新分数 425 放置在分数 1 和 2 之间,并且分数为 2,3,4,5,6, 7、8、9 和 10 会被推后,所以分数 2 现在是分数 3,分数 3 现在是分数 4,依此类推,直到我们得到分数 10,其中原始分数 10(即 20)不再存在,并且已被替换为分数 9,即 50

pap*_*aga 6

您应该使用标准库的算法。

假设分数是分数向量,并且 ns 是要插入的新分数:

首先,找到第一个小于新分数的元素:

auto pos = std::find_if(scores.begin(), scores.end(), [ns](auto s) {
    return s < ns;
});
Run Code Online (Sandbox Code Playgroud)

然后在这个位置插入新元素(vector.insert(it, elem)在它之前插入 elem )。

scores.insert(pos, ns);
Run Code Online (Sandbox Code Playgroud)

如果从一开始就以这种方式插入每个元素,则向量将始终被排序。您可以通过使用std::upper_bound来利用这个不变量,这将加快查找速度。

要删除插入后的最低分数,只需使用pop_back().