映射插入键但不是值

时间:2018-02-10 08:45:47

标签: c++ std stdmap

我今天正在玩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;
}

为什么插入不起作用?

1 个答案:

答案 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;

然后它会起作用。