C++代码"x.erase(std::remove(x.begin(), x.end(), ), x.end())"是如何工作的?
How does the C++ code `x.erase(std::remove(x.begin(), x.end(), ' '), x.end())` work?
问题是我通常会使用 for 循环来处理这种事情,但这种方法似乎更有效。关于cplusplus的文档对我来说有点难以理解。
std::string no_space(std::string x)
{
x.erase(std::remove(x.begin(), x.end(), ' '), x.end());
return x;
}
函数
std::remove(x.begin, x.end), ' ')
将元素移动到字符串的末尾,函数std::erase
实际删除移动到字符串末尾的元素。 您还可以在文档中阅读有关此内容的更多信息,在此处输入链接说明有和你一样的例子。
>std::remove
将所有空格移动到字符串的末尾,并将迭代器返回到第一个空格。然后string::erase
从第一个空格中删除,直到字符串的末尾。
这是一个简单的描述,正如评论者适当指出的那样,请确保您阅读了这些函数的文档。
让我们分解一下
std::remove(x.begin(), x.end(), ' ')
这将遍历x
的所有元素,并用下一个非空格覆盖任何空格。它返回最后一个非空格字符之外的位置。重要的是,它不会改变x
size
。假设返回值被分配给一个std::string::iterator it
。从it
到x
结束,元素处于有效但未指定的状态。
x.erase(it, x.end());
这会从x
中删除元素,从 remove
返回的位置开始。这消除了x
末尾的所有"有效但未指定的状态"值,这些值是由remove
留下的。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- QSqlquery prepare()和bindvalue()不工作
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 导入库可以跨dll版本工作吗
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- Python中的for循环与C++有何不同
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- C++代码"x.erase(std::remove(x.begin(), x.end(), ), x.end())"是如何工作的?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?