标签: erase-remove-idiom

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

vector<int> myVector;
Run Code Online (Sandbox Code Playgroud)

并且让我们说向量中的值是这个(按此顺序):

5 9 2 8 0 7
Run Code Online (Sandbox Code Playgroud)

如果我想删除包含值"8"的元素,我想我会这样做:

myVector.erase(myVector.begin()+4);
Run Code Online (Sandbox Code Playgroud)

因为那会抹掉第4个元素.但有没有办法根据值"8"擦除元素?喜欢:

myVector.eraseElementWhoseValueIs(8);
Run Code Online (Sandbox Code Playgroud)

或者我只是需要遍历所有的向量元素并测试它们的值?

c++ stl vector erase erase-remove-idiom

235
推荐指数
3
解决办法
29万
查看次数

std :: remove_if - lambda,不从集合中删除任何东西

好吧,我希望我在这里犯了一个愚蠢的错误.我有一个DisplayDevice3d列表,每个DisplayDevice3d都包含一个DisplayMode3d列表.我想删除DisplayDevice3d列表中没有任何DisplayMode3d的所有项目.我正在尝试使用Lambda来做它,即:

    // If the device doesn't have any modes, remove it.

  std::remove_if(MyDisplayDevices.begin(), MyDisplayDevices.end(),
   [](DisplayDevice3d& device) 
   { 
    return device.Modes.size() == 0; 
   }
  ); 
Run Code Online (Sandbox Code Playgroud)

即使出6名DisplayMode3d在MyDisplayDevices,只有1个有什么DisplayMode3d的其模式集合中,没有被从列表中删除.

我在这里犯了什么错误?

编辑:

好吧,我的错误是我应该使用MyDisplayDevices.remove_if而不是std :: remove_if,但是下面的答案对于使用std :: remove_if:p是正确的.

MyDisplayDevices.remove_if( [](DisplayDevice3d const & device) 
                            { 
                                return device.Modes.size() == 0; 
                            });
Run Code Online (Sandbox Code Playgroud)

c++ lambda erase-remove-idiom remove-if c++11

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

删除第一个和最后一个字符C++

如何从std :: string中删除第一个和最后一个字符,我已经在做以下代码了.

但是这段代码只删除了最后一个字符

m_VirtualHostName = m_VirtualHostName.erase(m_VirtualHostName.size() - 1)
Run Code Online (Sandbox Code Playgroud)

如何删除第一个字符?

c++ string stdstring erase-remove-idiom

26
推荐指数
2
解决办法
7万
查看次数

是否有更好的替代std :: remove_if来从向量中删除元素?

从一个std::vector容器或其他容器中删除具有特定属性的元素的任务适用于功能样式实现:为什么要烦扰循环,内存释放和正确移动数据?

但是,在C++中执行此操作的标准方法似乎是以下习惯用法:

std::vector<int> ints;
...
ints.erase(
    std::remove_if(ints.begin(), 
                   ints.end(),
                   [](int x){return x < 0;}),
    ints.end());
Run Code Online (Sandbox Code Playgroud)

此示例从整数向量中删除小于零的所有元素.

我发现它不仅丑陋而且容易错误使用.很明显,std::remove_if不能改变向量的大小(正如其名称所暗示的那样)因为它只传递了迭代器.但是许多开发人员,包括我自己,在开始时都没有这样做.

那么有更安全,更有希望实现这一目标的方式吗?如果没有,为什么?

c++ stl erase-remove-idiom c++11 c++17

26
推荐指数
2
解决办法
9775
查看次数

删除特定元素的std :: erase和std :: remove组合不适用于特定示例

#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<int> a = {1,2,3,7,1,5,4};
    vector<int> b = {6,7,4,3,3,1,7};
    a.erase(remove(a.begin(),a.end(),a[0]),a.end());
    b.erase(remove(b.begin(),b.end(),b[0]),b.end());

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

对于这个具体的例子,我的GNU gdb Ubuntu 7.7.1声明返回1行:a = {2,3,7,1,5,4}这是不期望的(只删除一个1),并且b = {7 ,4,3,3,1}这是不期望的.

我的期望是b应该是a = 2,3,7,5,4和b = 7,4,3,3,1,7.

这里发生了什么事?

c++ stl erase-remove-idiom

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

C ++标准库是否提供更紧凑,更通用的“擦除删除”习惯用法版本?

我们可以通过流行的“ 删除-删除”惯用语从容器中删除一个元素/条目。但是,在应用此惯用语时,我们许多人会遇到一些问题:


的范围内,我们是否有python范围更广,更不易打错的std::erase-std::remove_if东西,或者是否会有这样的工具?std::erase_if

c++ c++-standard-library erase-remove-idiom c++17 c++20

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

对于擦除删除习惯用法,为什么第二个参数必须指向容器的末尾?

考虑以下代码(摘自cppreference.com,略有修改):

#include <algorithm>
#include <string>
#include <iostream>
#include <cctype>

int main()
{
    std::string str1 = "     Text with some   spaces";
    str1.erase(std::remove(str1.begin(), str1.end(), ' '), str1.end());
    std::cout << str1 << '\n';

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

为什么第二个参数是erase必需的?(str1.end()在这种情况下。)

为什么我不能只提供其返回的迭代器removeerase?为什么我还必须告诉它要擦除的容器的最后一个元素?

这里的陷阱是,您也可以erase不使用第二个参数就进行调用,但是显然会产生错误的结果。

在某些情况下,我不想将容器的结尾作为第二个参数传递给erase

省略“ erase删除-删除”习惯用法的第二个参数是否总是一个错误,或者这可能是一个有效的做法?

c++ stl erase-remove-idiom

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

执行remove_if()后擦除()

我创建了一个函数来运行字符串向量并删除任何长度为3或更短的字符串.这是使用STL算法库的一课.

我遇到麻烦,因为这些函数有效但不仅删除长度为3或更小的字符串,而且还将字符串"vector"附加到结尾.

输出应该是

This test vector
Run Code Online (Sandbox Code Playgroud)

而是它

This test vector vector"
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

/*
* using remove_if and custom call back function, write RemoveShortWords 
* that accepts a vector<string> and removes all strings of length 3 or
* less from it. *shoot for 2 lines of code in functions.
*/

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

bool StringLengthTest(string test) //test condition for remove_if algo.  
{
    return test.length() <= 3;
}

void RemoveShortWords(vector<string> &myVector)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ erase-remove-idiom

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

使用erase-remove_if成语

让我说我有std::vector<std::pair<int,Direction>>.

我试图使用erase-remove_if成语从向量中删除对.

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));
Run Code Online (Sandbox Code Playgroud)

我想删除所有将.first值设置为4的对.

在我的例子中,我有成对:

- 4, Up
- 4, Down
- 2, Up
- 6, Up
Run Code Online (Sandbox Code Playgroud)

但是,在执行erase-remove_if后,我留下:

- 2, Up
- 6, Up
- 6, Up
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

c++ erase-remove-idiom

11
推荐指数
3
解决办法
7589
查看次数

STL"擦除 - 删除"成语:为什么不"调整大小 - 删除"?

通常理解的std::vector是,从a中完全删除所需项目的好方法是擦除 - 移除习语.

如上面链接中所述(截至本帖发布之日),在代码中,erase-remove惯用法如下所示:

int main()
{
  // initialises a vector that holds the numbers from 0-9.
  std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  // erase-remove idiom to completely eliminate the desired items from the vector
  v.erase( std::remove( std::begin(v), std::end(v), 5 ), std::end(v) ); 
}
Run Code Online (Sandbox Code Playgroud)

我想知道resize-remove成语在功能和性能方面是否与成语相同erase-remove.或者,也许我错过了一些明显的东西?

以下resize-remove成语是否等同于上述erase-remove成语?

int main()
{
  std::vector<int> v = { 0, 1, 2, 3, …
Run Code Online (Sandbox Code Playgroud)

c++ stl erase-remove-idiom

10
推荐指数
2
解决办法
3498
查看次数