【发布时间】:2019-08-22 11:25:22
【问题描述】:
我正在做一个家庭作业项目,并且被这个功能所困扰。我需要使用<vector> 和<set> 两次解决这个问题。我们只需要从作为参数传递的向量中消除重复元素。
这是我的第一次尝试。
vector<int> erase_repeating_elem(vector<int> s) {
int len = s.size();
for (int i = 0; i < len -1; i++) {
for (int j = i + 1; i < len; j++) {
if (s[i] == s[j]){
s.erase (s.begin()+j);
len--;
}
}
}
return s;
}
main(){
vector<int> s = {1, 1, 2, 2, 3, 3};
s = erase_repeating_elem(s);
std::cout << "myvector contains:";
for (unsigned i=0; i<s.size(); ++i)
std::cout << ' ' << s[i];
std::cout << '\n';
return 0;
}
当我尝试运行它时,我得到了这个:Process returned -1073741819 <0xC0000005>
我认为当我擦除矢量元素时可能是内存问题,因为我不知道是否再次计算 s.size()。所以我尝试了这个:
vector<int> erase_repeating_elem(vector<int> s) {
int len = s.size();
for (int i = 0; i < len -1; i++) {
for (int j = i + 1; i < len; j++) {
if (s[i] == s[j]){
s.erase (s.begin()+j);
len--;
}
}
}
return s;
}
我得到相同的错误代码。我正在考虑解决这个问题的其他方法,也许将重复的元素交换到向量的后面,然后只使用pop_back()。但我认为我的解决方案,如果可行的话,会更好。
我在 Code::Blocks 上使用 cygwin 工具链,但我无法让调试器运行。有什么建议吗?
另外,在<set> 案例中处理它的正确方法是什么?我猜只是将元素添加到一个新集合中,让它自己处理重复的元素。
谢谢。
【问题讨论】:
-
在这个循环中 for (int j = i + 1; i
-
A
set<T>已经是唯一的,那里没有重复项。我希望您想自己完整地写出代码,因为这是一项任务?否则你可以使用这个成语:v.erase(std::unique(v.begin(), v.end()), v.end()); -
感谢来自莫斯科的弗拉德,现在我遇到了复制粘贴的问题...
-
您可以使用
<algorithm>吗?例如“可能将重复的元素交换到向量的后面”正是std::unique所做的。 -
我不这么认为,他们只是让我们在整个分配中使用
、 和
标签: c++ vector set codeblocks