C++ 为什么我不能让迭代器用find设置元素?

C++ 为什么我不能让迭代器用find设置元素?,c++,find,set,C++,Find,Set,我试图在集合中找到对象,然后调用该对象方法。代码如下所示: void ExpenseManager::addCategory(const string &userName, const string &categName){ Client temp(userName); impl->clientsSet.find(temp)->addNewCategory(categName); } 此方法位于Expensemanager类中。这

我试图在集合中找到对象,然后调用该对象方法。代码如下所示:

   void ExpenseManager::addCategory(const string &userName, const string &categName){
      Client temp(userName);
      impl->clientsSet.find(temp)->addNewCategory(categName);
   }
此方法位于Expensemanager类中。这里的impl是指向内部类的指针,其中定义了clientsSet集(我将客户机对象存储在其中)。addNewCategory()是客户端类中的一个方法

我在impl位置收到一个错误,错误是:
“错误1错误C2662:'void ExpenseManagerNamespace::Client::addNewCategory(const std::string&'):无法将“this”指针从“const ExpenseManagerNamespace::Client”转换为“ExpenseManagerNamespace::Client&'”

有什么想法吗

编辑: 内部类和构造函数:

   class ExpenseManager::Implementation{
   private:
      set<Client> clientsSet;
      set<Client>::iterator clientPosSet;
      friend class ExpenseManager;
   };

   // Constructors/destructor-----------------------------------------------
   ExpenseManager::ExpenseManager()
      : impl(new Implementation()){
   }
class ExpenseManager::实现{
私人:
设置客户端集合;
迭代器clientPosSet;
朋友级费用经理;
};
//构造函数/析构函数-----------------------------------------------
ExpenseManager::ExpenseManager()
:impl(新实现()){
}

集合中的元素是不可变的,因为通常,更改它们会更改它们在集合中的排序位置。您的选择包括,在大约不断增加的污秽程度中:

  • 使用
    映射
    ,将客户端数据拆分为不可变标识符和可变数据
  • 移除元素并重新插入修改后的副本
  • 声明可变数据
    mutable
    和修改它的函数
    const
  • 使用
    const\u cast
    允许修改
如果您确信修改不会影响其在集合中的位置,则最后两个选项只是一个选项,否则将破坏集合


另外,在尝试访问之前,不要忘记检查是否找到了客户端(即
find
没有返回
clientsSet.end()
)。

集合的元素是不可变的,因为通常,更改它们会更改它们在集合中的排序位置。您的选择包括,在大约不断增加的污秽程度中:

  • 使用
    映射
    ,将客户端数据拆分为不可变标识符和可变数据
  • 移除元素并重新插入修改后的副本
  • 声明可变数据
    mutable
    和修改它的函数
    const
  • 使用
    const\u cast
    允许修改
如果您确信修改不会影响其在集合中的位置,则最后两个选项只是一个选项,否则将破坏集合


另外,在尝试访问之前,不要忘记检查是否找到了客户端(即
find
没有返回
clientsSet.end()
)。

集合的元素是不可变的,因为通常,更改它们会更改它们在集合中的排序位置。您的选择包括,在大约不断增加的污秽程度中:

  • 使用
    映射
    ,将客户端数据拆分为不可变标识符和可变数据
  • 移除元素并重新插入修改后的副本
  • 声明可变数据
    mutable
    和修改它的函数
    const
  • 使用
    const\u cast
    允许修改
如果您确信修改不会影响其在集合中的位置,则最后两个选项只是一个选项,否则将破坏集合


另外,在尝试访问之前,不要忘记检查是否找到了客户端(即
find
没有返回
clientsSet.end()
)。

集合的元素是不可变的,因为通常,更改它们会更改它们在集合中的排序位置。您的选择包括,在大约不断增加的污秽程度中:

  • 使用
    映射
    ,将客户端数据拆分为不可变标识符和可变数据
  • 移除元素并重新插入修改后的副本
  • 声明可变数据
    mutable
    和修改它的函数
    const
  • 使用
    const\u cast
    允许修改
如果您确信修改不会影响其在集合中的位置,则最后两个选项只是一个选项,否则将破坏集合


另外,在尝试访问之前,不要忘记检查是否找到了客户端(即
find
没有返回
clientsSet.end()
)。

在C++11中,
std::set::find
有一个重载,返回一个
常量迭代器。它似乎在调用该重载,而不是返回一个
迭代器的版本,因此当您试图更改数据时,您会得到
常量
错误

这样做的原因可能与更严格的强制执行有关,即使集合中的值的行为类似于键(例如,不可变)。可以找到一个相关的问题


基本上,如果要修改某个图元,应将其从集合中删除、修改并重新插入,除非您可以完全确定所做的更改不会影响集合的比较。如果可以确保更改不会破坏集合,则可以使用
const\u cast
授予对元素的写访问权。

在C++11中,
std::set::find
有一个重载,返回
const\u迭代器。它似乎在调用该重载,而不是返回一个
迭代器的版本,因此当您试图更改数据时,您会得到
常量
错误

这样做的原因可能与更严格的强制执行有关,即使集合中的值的行为类似于键(例如,不可变)。可以找到一个相关的问题

基本上,如果要修改某个图元,应将其从集合中删除、修改并重新插入,除非您可以完全确定所做的更改不会影响集合的比较。如果您可以确保更改不会破坏您的设置,您可以使用
const\u cast
为您提供写操作