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

时间:2017-07-20 15:00:11

标签: c++ string windows mfc set

我正在使用VS 2012处理MFC应用程序。在此应用程序中,我想使用CString成员函数清理Trim()个对象的容器。首先,我使用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::vector替换std::set。因此,我添加#include <set>代替#include <vector>并更改了main(),如下所示:

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

但是,这会在s.begin()->Trim();行上给出以下编译错误:

  

错误C2663:&#39; ATL :: CStringT&gt;&gt; ::修剪&#39; :3个超载没有法律转换,因为这个&#39;指针

documentation of the error基本上说:

  

[...]此错误可能是由于在const对象上调用非const成员函数引起的。 [...]

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

为什么我不能Trim() CString std::set A对象上使用y = A x?如何解决此问题?

1 个答案:

答案 0 :(得分:2)

  

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

你不能也不应该。 std::set中的元素在内部排序。如果您被允许更改它们,那将破坏顺序。

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