我正在查看stl向量的API文档,并注意到vector类上没有允许删除具有特定值的元素的方法.这看起来像是一个常见的操作,似乎很奇怪,没有内置的方法来做到这一点.
我想使用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)
这段代码显然崩溃了,因为我在迭代它时改变了向量的末尾.实现这一目标的最佳方法是什么?也就是说有没有办法做到这一点,而无需多次迭代矢量或创建一个矢量的副本?
我有这个:
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)
是的,我知道我只是胡说八道,但那是你的意思.在某个地方应该有一个像这样的简单解决方案,我只是想要那样.
假设我有以下向量:
向量是对的向量,我们基于第一个元素进行比较.
[(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++中按值删除元素的问题的答案:
基本上:
vec.erase(std::remove(vec.begin(), vec.end(), valueToRemove), vec.end());
Run Code Online (Sandbox Code Playgroud)
答案是有道理的,但这不是坏风格吗?逻辑由双重否定组成......有更清洁的方法吗?
假设我们被赋予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并将迭代器返回到该范围的末尾.我想在那里剪辑矢量.