什么叫"一次遍历删除vector中不连续的元素”?

thunk123 2014-10-20 05:56:06
前段时间辞职了,今天没事干 面了一个公司。面试官问C++ STL中VECTOR 如何一次遍历删除vector中不连续的元素,难道咱以前是多次遍历才删除?,而且他还强调说不连续。他这里说的连续性应该是有序和无序吧?反正我没听懂他的问题。how about you?
...全文
359 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztenv 版主 2015-09-17
  • 打赏
  • 举报
回复
估计是考你: 1、迭代删除会导致迭代器发生变化 2、STL算法
lm_whales 2015-09-17
  • 打赏
  • 举报
回复
引用 7 楼 cs290473786 的回复:
erase(remove_if(...), vi.end()); 面试官的意思是删除vector不连续的元素值是某一值的所有元素;
++ 当然也可以指定位置(下标) 这样的的话,就不好用 remove_if 了, 这要手工处理了,数据移动了.只要移动到尾部,就成。 删除很简单,只需要重置一下 size
引用 3 楼 ri_aje 的回复:
没听明白当场直接问就行了,就像楼上说的,搞清问题本身也是面试一部分,有些面试官故意不说明白,就是看你怎么处理模糊需求,是花精力先搞清楚问题,还是想当然的就直接上了。 言归正传,我猜面试官的意思是,需要删除的元素在 vector 中对应的下标标号是不连续的,比如: {1,2,3,4,5,5,4,3,2,1} 然后让你删除 2,有两个元素满足条件,下标分别是 1 和 8,然后看你怎么删除,大概要考的就是对标准容器的行为是否熟悉。
++
baidu_31327011 2015-09-15
  • 打赏
  • 举报
回复
就是你用erase删除一个之后,容器的下标值会变动,如果一次遍历的话就会出乱子了。 比如:你想删除下标为2,3,7的元素,结果,你删除了下标为2的元素之后,原先的容器中下标为3的就不是删除下标为2之前的那个元素了,会删除最初容器中下标为4的元素。vector a =[44,55,66,77,88,54,65,67];66下标为2,删除之后,a=[44,55,77,88,54,65,67],再删除下标为3的元素时,就会删除88了,而我们想要删除77,他才是原始a中的下标为3的元素!!
Uron 2014-10-21
  • 打赏
  • 举报
回复
erase(remove_if(...), vi.end()); 面试官的意思是删除vector不连续的元素值是某一值的所有元素;
幻夢之葉 2014-10-21
  • 打赏
  • 举报
回复
因为erase会使指针失效,而且删除不连续的就造成需要多次进行erase! 可以这样子

for( it = v.begin(); it != v.end(); /*空表达式*/)
{
    if( *it == 需要删除的值 ) // 这里假定需求是删除指定值的所有元素)
        it = v.erase(it);
    else
        ++it;
}
sg_knight 2014-10-21
  • 打赏
  • 举报
回复
引用 4 楼 mymtom 的回复:
remove_if可以吧?remove_if 就是一次遍历的。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool
pred(const int &a)
{
    if (a % 3 == 0)
        return true;
    else
        return false;
}

int
main(int argc, char *argv[])
{
    int i, n;
    vector<int> vi;
    vector<int>::const_iterator it;

    n = 10;
    for (i = 0; i < n; ++i)
        vi.push_back(i);

    for (it = vi.begin(); it != vi.end(); ++it)
        cout << *it << ' ';
    cout << endl;

    vi.erase(remove_if(vi.begin(), vi.end(), pred), vi.end());

    for (it = vi.begin(); it != vi.end(); ++it)
        cout << *it << ' ';
    cout << endl;

    return 0;
}
学习了。
mymtom 2014-10-21
  • 打赏
  • 举报
回复
remove_if可以吧?remove_if 就是一次遍历的。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool
pred(const int &a)
{
    if (a % 3 == 0)
        return true;
    else
        return false;
}

int
main(int argc, char *argv[])
{
    int i, n;
    vector<int> vi;
    vector<int>::const_iterator it;

    n = 10;
    for (i = 0; i < n; ++i)
        vi.push_back(i);

    for (it = vi.begin(); it != vi.end(); ++it)
        cout << *it << ' ';
    cout << endl;

    vi.erase(remove_if(vi.begin(), vi.end(), pred), vi.end());

    for (it = vi.begin(); it != vi.end(); ++it)
        cout << *it << ' ';
    cout << endl;

    return 0;
}
ri_aje 2014-10-21
  • 打赏
  • 举报
回复
没听明白当场直接问就行了,就像楼上说的,搞清问题本身也是面试一部分,有些面试官故意不说明白,就是看你怎么处理模糊需求,是花精力先搞清楚问题,还是想当然的就直接上了。 言归正传,我猜面试官的意思是,需要删除的元素在 vector 中对应的下标标号是不连续的,比如: {1,2,3,4,5,5,4,3,2,1} 然后让你删除 2,有两个元素满足条件,下标分别是 1 和 8,然后看你怎么删除,大概要考的就是对标准容器的行为是否熟悉。
thunk123 2014-10-20
  • 打赏
  • 举报
回复
呵呵,,我所发的仅是原话而已,
FancyMouse 2014-10-20
  • 打赏
  • 举报
回复
没搞清问题在这里说有蛋用。搞清楚问题本身就是面试的一部分。

64,681

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧