c++ - 重置类(class)成员

标签 c++ loops c++11 stdmap

#include <iostream>
#include <map>

using namespace std;

class A
{
public:
    void SetData(std::string key, int value) 
    { 
        if(m_data.find(key) != m_data.end()) m_data.at(key) = value;
        else m_data.insert(std::make_pair(key,value));
    }
    int GetData(std::string key)
    {
        if(m_data.find(key) != m_data.end()) return m_data.at(key);
        return 0;
    }
    void ResetData()
    {
        for(auto item : m_data)
            item.second = 0;
    }
    void ResetData2()
    {
        for(auto it=m_data.begin(); it!=m_data.end(); it++)
            (*it).second = 0;
    }

private:
    std::map<std::string, int> m_data;
};

int main() 
{
    A a;
    a.SetData("KEY1", 10);
    std::cout << "Key1: " << a.GetData("KEY1") << std::endl;
    a.ResetData();
    std::cout << "Key1: " << a.GetData("KEY1") << std::endl;
    a.ResetData2();
    std::cout << "Key1: " << a.GetData("KEY1") << std::endl;

    return 0;
}

输出:

Key1: 10
Key1: 10
Key1: 0

现场演示:https://ideone.com/GH3Ft8

这里的两种重置方式有什么区别? 重置类成员 std::map<std::string, int> m_data使用迭代器方法 (ResetData2()) 的工作方式与预期相同,但不是基于范围的循环 (ResetData())!

最佳答案

第一个方法应该修改每个项目的引用

void ResetData()
{
    for(auto& item : m_data)
        item.second = 0;
}

否则,您会将 map 中每个项目的拷贝的值设置为零。

关于c++ - 重置类(class)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44906367/

相关文章:

java - 计算偶数和奇数的数量

Python 在 "IN"循环中使用 "IF ELSE"

c++ - 返回值优化和副作用

c++ - 具有共享内存的 cuda 平铺 3d 卷积实现

c++ - 从字符串中读取整数

c++ - 关于C++中类的私有(private)成员

c++ - 用于在 Windows 7 上输出的 fstream

java - 循环运行 Junit 测试,如果两者之间的一个失败,则继续运行

c++ - Auto 和 Void 的区别?

c++ - boost::lexical_cast 对于 c++11 stoi、stof 和 family 是否是多余的?