Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::自动设置迭代器常量_C++_Set_Constants_Std - Fatal编程技术网

C++ std::自动设置迭代器常量

C++ std::自动设置迭代器常量,c++,set,constants,std,C++,Set,Constants,Std,可能重复: 为了简单起见,我提取了问题并更改了名称等 基本上,我实例化了一个类,并将其存储在std::set中,稍后我希望有一个对该类的引用,以便检查其值并修改它们 简化代码: MyClass tmpClass; std::set<MyClass > setMyClass; setMyClass.insert(tmpClass); std::set<MyClass >::iterator iter;

可能重复:

为了简单起见,我提取了问题并更改了名称等

基本上,我实例化了一个类,并将其存储在std::set中,稍后我希望有一个对该类的引用,以便检查其值并修改它们

简化代码:

        MyClass tmpClass;
        std::set<MyClass > setMyClass;
        setMyClass.insert(tmpClass);
        std::set<MyClass >::iterator iter;
        iter=setMyClass.begin();
        MyClass &tmpClass2=*iter;
(我删除了部分错误消息“MVB::Run::”以将其清除。)

如果我在最后一行代码中添加一个前面的“const”,那么一切都很好,但是我不能更改值

这是正常的行为吗?比如说,我必须删除数据,更改值,然后再放回去


我觉得这与集合的排序有关,但我不会涉及用于排序的变量。

是的,这是意料之中的。如果您能够编辑集合中已存在的对象,则应用的排序顺序可能不再适用,从而导致未定义的行为。

I您可以确定您
不会接触用于排序的变量
,您可以使用如下方法解决此问题:

    MyClass tmpClass;
    std::set<MyClass > setMyClass;
    setMyClass.insert(tmpClass);
    std::set<MyClass >::iterator iter;
    iter=setMyClass.begin();
    const MyClass &tmpClass2=*iter;

    MyClass &tmpClass3 = const_cast<MyClass&>(tmpClass2);
MyClass-tmpClass;
std::set setMyClass;
setMyClass.insert(tmpClass);
std::set::迭代器iter;
iter=setMyClass.begin();
常量MyClass和tmpClass2=*iter;
MyClass&tmpClass3=常量(tmpClass2);

或者,您可以将要更改的类的成员声明为

您可以这样做,但这是一种不好的做法。@Oliver:如果您有异构查找,并且希望更改非键部分,那么使用常量迭代器是非常烦人的。我同意const_cast是一种不好的做法,但除了到处使用mutable或使用erase/insert来降低性能之外,还有什么替代方法呢?您还可以使用一组MyClass指针,它们是可散列/可排序的,与变量无关。(即,您可以通过指针修改其变量)
    MyClass tmpClass;
    std::set<MyClass > setMyClass;
    setMyClass.insert(tmpClass);
    std::set<MyClass >::iterator iter;
    iter=setMyClass.begin();
    const MyClass &tmpClass2=*iter;

    MyClass &tmpClass3 = const_cast<MyClass&>(tmpClass2);