相关疑难解决方法(0)

如何从具有特定值的stl向量中删除项?

我正在查看stl向量的API文档,并注意到vector类上没有允许删除具有特定值的元素的方法.这看起来像是一个常见的操作,似乎很奇怪,没有内置的方法来做到这一点.

c++ stl

135
推荐指数
7
解决办法
20万
查看次数

从矢量中删除元素

我想使用erase方法从向量中清除元素.但是这里的问题是元素不能保证在向量中只出现一次.它可能存在多次,我需要清除所有这些.我的代码是这样的:

void erase(std::vector<int>& myNumbers_in, int number_in)
{
    std::vector<int>::iterator iter = myNumbers_in.begin();
    std::vector<int>::iterator endIter = myNumbers_in.end();
    for(; iter != endIter; ++iter)
    {
        if(*iter == number_in)
        {
            myNumbers_in.erase(iter);
        }
    }
}

int main(int argc, char* argv[])
{
    std::vector<int> myNmbers;
    for(int i = 0; i < 2; ++i)
    {
        myNmbers.push_back(i);
        myNmbers.push_back(i);
    }

    erase(myNmbers, 1);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码显然崩溃了,因为我在迭代它时改变了向量的末尾.实现这一目标的最佳方法是什么?也就是说有没有办法做到这一点,而无需多次迭代矢量或创建一个矢量的副本?

c++ stl vector erase

94
推荐指数
3
解决办法
13万
查看次数

如何通过指针擦除向量元素?

我有这个:

vector<Object*> myVec;
Run Code Online (Sandbox Code Playgroud)

并将我的对象添加到它像这样:

Object *obj1 = new Object;
myVec.push_back(obj1);
Run Code Online (Sandbox Code Playgroud)

让我们假设我有这样的100个对象,指针为*obj1,*obj2 ...*obj100.
现在我想从向量中删除让我们说的obj37.我希望我能像推动它那样做:

myVec.remove_back(obj37);
Run Code Online (Sandbox Code Playgroud)

如果有像"remove_back"这样的函数会很棒,但我认为没有.我希望你明白这一点,请帮助我.

顺便说一句,只看这个问题,在接受的答案中,有删除算法按值运行:

vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
Run Code Online (Sandbox Code Playgroud)

我用指针给了它一个镜头,即使我不相信这会起作用和惊喜; 它没有:

myVec.erase(std::remove(myVec.begin(), myVec.end(), *obj37), vec.end());
Run Code Online (Sandbox Code Playgroud)

是的,我知道我只是胡说八道,但那是你的意思.在某个地方应该有一个像这样的简单解决方案,我只是想要那样.

c++ pointers vector

4
推荐指数
1
解决办法
1万
查看次数

除了特定范围内的最大元素外,如何擦除矢量中的所有元素?

假设我有以下向量:

向量是对的向量,我们基于第一个元素进行比较.

[(1,0),(0,1),(3,2),(6,3),(2,4),(4,5),(7,6),(5,7)]
Run Code Online (Sandbox Code Playgroud)

我想擦除除最大值之外的特定范围内的所有元素.

例如,如果范围是$ l = 2 $和$ r = 5 $,那么输出:

[(1,0),(0,1),(6,3),(7,6),(5,7)]
Run Code Online (Sandbox Code Playgroud)

现在,如果我们再次对$ l = 1 $,$ r = 4 $的输出数组执行此操作,那么输出:

[(1,0),(7,6)]
Run Code Online (Sandbox Code Playgroud)

我发现这个我认为在这里很有用,但我不知道如何使它成对使用.

这是我的尝试:

int main(int argc, char const *argv[]) {
    int N;
    cin >> N;
    vector< pair<int,int> > vector_of_pairs(N);

    for (int i = 0; i < N; i++) {
        int input;
        cin >> input;
        vector_of_pairs[i] = make_pair(input, i);
    }

    int l, r;
    cin >> l >> r;

    int max_in_range = vector_of_pairs[l].first;

    for (int i = …
Run Code Online (Sandbox Code Playgroud)

c++ vector

2
推荐指数
1
解决办法
918
查看次数

在C++中按值删除元素 - 首选的习语是否真的由双重否定组成?

我遇到了在C++中按值删除元素的问题的答案:

C++按值而不是按位置擦除向量元素?

基本上:

vec.erase(std::remove(vec.begin(), vec.end(), valueToRemove), vec.end());
Run Code Online (Sandbox Code Playgroud)

答案是有道理的,但这不是坏风格吗?逻辑由双重否定组成......有更清洁的方法吗?

c++ stl idioms erase

1
推荐指数
1
解决办法
326
查看次数

在C++中给定迭代器调整向量大小

假设我们被赋予std::vector<T> V了一个迭代器p并且向量中的位置.

Q1:返回w给定迭代器p为std :: end(w)的新向量的好方法是什么?

我可以创建一个新的向量w,将元素从std :: begin(v)移动到p并赋值p = std::end(w).

Q2:有没有办法做我想要的但保持p const

我的问题的起源如下:我有一个我应用的向量std::remove(std::begin(v),std::end(v), elem).这应该放置所有不相等的元素,elem并将迭代器返回到该范围的末尾.我想在那里剪辑矢量.

c++ c++11

1
推荐指数
1
解决办法
688
查看次数

标签 统计

c++ ×6

stl ×3

vector ×3

erase ×2

c++11 ×1

idioms ×1

pointers ×1