如何修剪存储在std :: set中的string?

我正在使用VS 2012的MFC应用程序。在这个应用程序中,我想通过使用Trim()成员函数清理CString对象的容器。 首先,我使用了一个std::vector作为容器,如下面的MCVE所示:

 #define _AFXDLL // CString #include <afx.h> // CString #include <vector> int main() { std::vector<CString> v; v.push_back(_T("Test")); v.begin()->Trim(); return 0; } 

这个编译和按预期工作。 然后,我想用std::setreplacestd::vector 。 因此,我包含#include <set>而不是#include <vector>并更改了main() ,如下所示:

 int main() { std::set<CString> s; s.insert(_T("Test")); s.begin()->Trim(); return 0; } 

但是,这给了我下面的编译错误s.begin()->Trim(); 线:

错误C2663:'ATL :: CStringT >> :: Trim':3重载没有合法的转换'this'指针

错误的文档基本上说:

[…]这个错误可能是由调用一个const对象的非const成员函数引起的。 […]

但是,与vector版本相比,我没有添加任何const限定符。 另外, std::set::begin()提供了一个非常量迭代器,就像std::vector::begin()一样。 我在错误C2663上find类似的问题,例如这个 。 但是在大多数情况下,有人试图从const函数中修改一个成员,这在我的代码中并不是这样。

为什么我不能在std::set CString对象上使用Trim() ,我该如何解决这个问题?

如何修剪存储在std :: set中的字符串?

你不能,你不应该。 std::set中的元素在内部排序。 如果你被允许改变他们,这将打破订单。

您最好的选择是从集合中删除现有的项目,并将修改后的项目添加到集合中。