我今天正在玩c ++代码。了解std容器。我正在尝试在std :: map中插入和更新数据但由于某种原因我无法将值插入到地图中。键将插入但不会插入值。如果您在打开的终端中输入内容,则底部的代码将打印以下内容。在这个例子中,我输入了“test”。无论如何,我的问题是,为什么插入返回false,为什么值不插入?
test
first
failed
Context1 :
以下是代码:
#include "stdafx.h"
#include <string>
#include <iostream>
#include <map>
#include <random>
static std::map<std::string, std::string> currentFullState;
static const std::string sDEFAULT_STRING = "";
void PringCurrentState()
{
std::map<std::string, std::string>::iterator stateData = currentFullState.begin();
while (stateData != currentFullState.end())
{
std::cout << stateData->first << " : ";
std::cout << stateData->second << std::endl;
stateData++;
};
}
void UpdateState(std::string context, std::string data)
{
if (currentFullState[context] == sDEFAULT_STRING)
{
// first entry, possibly special?
std::cout << "first" << std::endl;
auto result = currentFullState.insert(std::make_pair(context, data.c_str()));
if (result.second == false)
std::cout << "failed" << std::endl;
else
std::cout << "good" << std::endl;
}
else if (data != currentFullState[context])
{
// change in value
}
else
{
currentFullState[context] == data;
}
}
void DoWork()
{
if (rand() % 2)
{
UpdateState("Context1", "Data1");
}
else
{
UpdateState("Context2", "Data2");
}
}
int main()
{
std::string command = "";
for (;;)
{
PringCurrentState();
std::cin >> command;
DoWork();
if (command == "q")
{
break;
}
}
return 0;
}
为什么插入不起作用?
答案 0 :(得分:1)
如果你写了
,肯定会有所帮助currentFullState[context] = data;
而不是
currentFullState[context] == data;
另外
auto result = currentFullState.insert(std::make_pair(context, data));
应该优先于
auto result = currentFullState.insert(std::make_pair(context, data.c_str()));
第二个编译时有点惊讶。
=============================================== ==========================
插入失败的真正原因是您第二次添加该密钥。这是第一次
if (currentFullState[context] == sDEFAULT_STRING)
operator[]
在地图上始终将关键字添加到地图中。这就是你第二次尝试添加
auto result = currentFullState.insert(std::make_pair(context, data.c_str()));
失败,密钥已经存在。如果你写了
currentFullState[context] = data;
然后它会起作用。