2

可能重复:
从 C++ 中的 std::string 中删除空格
std::remove 不起作用

我使用 std::remove 从字符串中删除一些字符。例如:

std::string hash_value = "3f-2b-d6-ab-aa-6d-62-b4-ce-6f-6b-2f-21-4c-99-fc";
std::remove(hash_value.begin(), hash_value.end(), '-');

之后这个hash_value大小必须是 32 并且有值:

3F2BD6ABAA6D62B4CE6F6B2F214C99FC

但它 47 的大小和价值:

3F2BD6ABAA6D62B4CE6F6B2F214C99FC-2F-21-4C-99-FC

你能帮我吗,我做错了什么?谢谢!

4

3 回答 3

4

您需要使用remove-erase idiom。std::remove 仅将元素移动到容器的末尾,之后您需要删除它们。

尝试

hash_value.erase(std::remove(hash_value.begin(), hash_value.end(), '-'), hash_value.end());
于 2013-01-27T12:30:44.773 回答
2

std::remove重新排列序列的内容,以便“删除”的元素位于末尾,其中 end 定义为函数返回的迭代器与序列末尾之间的范围。如果你想让你的序列更短,请使用erase-remove idiom

hash_value.erase(std::remove(hash_value.begin(), hash_value.end(), '-'), hash_value.end()); 
于 2013-01-27T12:31:06.517 回答
0

该函数不能更改包含元素范围的对象的属性(即,它不能更改数组或容器的大小):删除是通过将比较等于 val 的元素替换为下一个不等于 val 的元素来完成的。 ,并通过将迭代器返回到应该被视为其新的过去元素的元素来发出缩短范围的新大小的信号。

例如看下面与 std::remove 相关的例子

int myints[] = {10,20,30,30,20,10,10,20}; // 10 20 30 30 20 10 10 20

// 范围边界:

int* pbegin = myints; // ^

int* 挂起 = myints+sizeof(myints)/sizeof(int);

// 现在挂起指向容器(逻辑)结束的点

挂起 = std::remove (pbegin, 挂起, 20);

std::cout << "范围包含:";

for (int* p=pbegin; p!=pend; ++p)

std::cout << ' ' << *p;

它会显示

范围包含:10 30 30 10 10

于 2013-01-27T13:43:05.217 回答