我正在创建一个分数表,其中分数存储在向量中。当添加一个新分数并且它比向量中的当前分数更大时,我希望添加该分数(我已经完成了),但随后我希望该分数后面的所有分数基本上向后移动,以便为新分数。
所以基本上我想说的是,当一个新元素添加到 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
您应该使用标准库的算法。
假设分数是分数向量,并且 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().