【发布时间】:2019-11-02 06:17:43
【问题描述】:
我有一个包含{1, 0, 0, 0, 0, 0 ,0} 的vector<int> number_vector。我需要迭代这个number_vector,例如4次,并在每次迭代中删除第一个最小的数字,即在第一次迭代中我将删除索引1处的值0,在下一次迭代中我将删除索引1 中的0 等。我现在正在执行以下操作:
int n = 7;
int d = 4;
vector<int> number_vector{1, 0, 0, 0, 0, 0 ,0};
for (int counter = 0; counter < n - d; counter++)
{
int index = distance(number_vector.begin(), min_element(number_vector.begin(), number_vector.end()));
if (index != number_vector.size() - 1)
{
number_vector[index] = move(number_vector.back());
}
number_vector.pop_back();
// number_vector.erase(number_vector.begin() + index);
}
问题在于,如果我运行上面的代码,最后number_vector 有{1, 0, 0, 0} 而它应该有{1, 0, 0},对于其他情况,如n = 4、d = 2 和number_vector{3, 7, 5, 9},最终的number_vector 具有正确的值,即79。一些提示?
【问题讨论】:
-
std::vector如果您想在除末尾之外的任何位置插入/删除元素,则数据结构的选择是错误的。我推荐使用std::list。如果您想要O(1)空间,则每次删除都会花费您O(n)时间。 -
使用调试器单步调试代码(如果您不知道如何使用,只需在线搜索)并检查代码的作用。这是找出如此小而孤立的代码中哪里出了问题的最简单方法。
-
通知您更改剩余元素的顺序。那么
std::partial_sort是可能的。 -
@lucieon - 不一定。在现代 CPU 的小型数据集上,这可能非常快。甚至比列表更快。但他没有说明这些向量有多大。这可能是一个更好的算法。