我用c ++中的几个元素创建了一个向量,我想删除具有相同值的向量元素。基本上,我想删除找到重复元素的向量的整个索引。我的矢量被称为人。我正在尝试做类似的事情:
for(int i=0; i < person.size(); i++){
if(i>0 && person.at(i) == person.at(0:i-1)) { // matlab operator
continue;
}
writeToFile( perason.at(i) );
}
如何创建运算符0:i-1来检查所有可能的索引组合?
编辑:我正在尝试GarMan解决方案,但我遇到了各自的问题:
set<string> myset;
vector<string> outputvector;
for (string element:person)
{
if (myset.find(element) != myset.end())
{
myset.insert(element);
outputvector.emplace_back(element);
}
}
答案 0 :(得分:3)
这是一个“就地”版本(不需要第二个向量),应该适用于较旧的编译器:
std::set<std::string> seen_so_far;
for (std::vector<std::string>::iterator it = person.begin(); it != person.end();)
{
bool was_inserted = seen_so_far.insert(*it).second;
if (was_inserted)
{
++it;
}
else
{
swap(*it, person.back());
person.pop_back();
}
}
如果这对您有用,请告诉我。请注意,元素的顺序不能保证保持不变。
答案 1 :(得分:2)
如果您sort
vector
std::unique
,则可以致电#include <algorithm>
std::sort(person.begin(), person.end());
person.erase(std::unique(person.begin(), person.end()), person.end());
。
sort
如果您不能hash-table
,则可以使用O(1)
代替扫描向量并相应地更新哈希表。同时,您可以轻松检查O(n)
中是否已存在一个元素(总共O(n^2)
)。您不需要检查每个元素的所有其他元素,这将花费时间{{1}}。
答案 2 :(得分:2)
这样的东西会起作用
unordered_set<same_type_as_vector> myset;
vector<same_type_as_vector> outputvector;
for (auto&& element: myvector)
{
if (myset.find(element) != myset.end())
{
myset.insert(element);
outputvector.emplace_back(element);
}
}
myvector.swap(outputvector);
代码写入回复框,因此可能需要调整。