重置 class 个成员
Reset class member
#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
这里的两种重置方法有什么区别?
使用迭代器方法 (ResetData2()
) 重置 class 成员 std::map<std::string, int> m_data
像预期的那样工作,但不是基于范围的循环 (ResetData()
)!
第一种方法应该修改每个项目的引用
void ResetData()
{
for(auto& item : m_data)
item.second = 0;
}
否则,您会将地图中每个项目的 副本 的值设置为零。
您的问题在这里:
for(auto item : m_data)
它创建了你的键值的副本对于你想要的,使用:
for(auto &item: m_data)
#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
这里的两种重置方法有什么区别?
使用迭代器方法 (ResetData2()
) 重置 class 成员 std::map<std::string, int> m_data
像预期的那样工作,但不是基于范围的循环 (ResetData()
)!
第一种方法应该修改每个项目的引用
void ResetData()
{
for(auto& item : m_data)
item.second = 0;
}
否则,您会将地图中每个项目的 副本 的值设置为零。
您的问题在这里:
for(auto item : m_data)
它创建了你的键值的副本对于你想要的,使用:
for(auto &item: m_data)