我有一个带有0-14随机数的向量,其中一些可能是重复的(例如{3,8,11,2,3,6,1,11,9,4,13} ,12,6,5,4}并未显示所有数字)并且我想删除重复项并确保每个数字都表示为0-14。
所以我有另一个vector<int> unrepresented
和vector<int> duplicates
。我填补&#34;无人代表&#34;每个数字0-14:
for (int i = 0; i<num; i++)
{
unrepresented.push_back(i);
}
然后我会做以下事情:
for (int i = 0; i<num; i++)
{
if (find(unrepresented.begin(), unrepresented.end(), new_gene_array_one[i]) != new_gene_array_one.end())
unrepresented.erase(i);
else
duplicates.push_back(new_gene_array_one[i]);
}
我知道擦除功能应该是一个迭代器,但我仍然没有真正理解它应该如何使用它,因为我想要擦除某个元素(不是一个位置,但实际数字在&#34;无代表&#34;如果它在那里,否则如果它不在那里,那么把它放在重复矢量中,然后在整个事物中取出未表示的矢量中的元素并替换重复的元素原始矢量所以所有数字都将被表示。
答案 0 :(得分:1)
你需要使用#34;找到的迭代器&#34;按find
,并在erase
中使用,或者它不会起作用。
API功能可以非常准确地记录下来,如果你给他们提供他们不希望作为参数的东西,他们就不会做你想做的事。
如果您传递vector::erase
int
,它会尝试将其解释为迭代器,因此如果您键入erase(i)
,它将删除i
处的元素{1}}位置,不会从列表中删除号码i
。
答案 1 :(得分:0)
迭代器是容器类中元素的“抽象引用”(在本例中为std :: vector)。您可以使用以下命令更改擦除功能:
unrepresented.erase(unrepresented.begin() + i);
如果你对性能感到困扰,这不是一个非常有效的算法,因为vector
数据结构必须在删除的元素之后移动(通过复制)所有元素调用擦除功能的时间。有不同的(标准)解决方案来缓解这个问题,这可能是另一个问题的原因。
答案 2 :(得分:0)
可采取完全不同的方法。在后面再次添加所有数字:
for (int i = 0; i < num; ++i) {
new_gene_array_one.push_back(i);
}
现在所有数字都有代表,但我们可能有重复数字。使用一组来跟踪我们到目前为止看到的那些,并使用erase-remove惯用法删除重复项:
std::unordered_set<int> seen;
new_gene_array_one.erase(
std::remove_if(new_gene_array_one.begin(),
new_gene_array_one.end(),
[&](int i) {
return !seen.insert(i).second;
}),
new_gene_array_one.end()
);
unordered_set::insert
表示插入是否成功。如果它成功了,这意味着它是我们第一次看到这个价值,所以我们保留它。如果插入失败,那就是dup,我们想要删除它 - 所以我们对remove_if
的谓词返回true;
答案 3 :(得分:0)
如果你需要随机顺序的0到14之间的数字,我建议你按顺序用0到14之间的数字填充一个向量,然后使用一个shuffle,例如: std::random_shuffle
。这很简单,而且会非常随意:
vector<int> v = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
//using random shuffle:
std::random_shuffle(begin(v), end(v));
通常,您通常希望使用erase-remove idiom从std::vector
中删除。
在OP澄清后,如果random_shuffle
不可能,那么Barry关于使用集合的想法是很好的建议。在这种情况下,一个有点艰难的挑战是确保随机性。如果您只是推回或替换建议的值,您将没有真正的随机性。根据随机性的重要程度,或者随机顺序需要这些数字的原因,您可能需要进行额外的处理。