C++ C+中的非法间接寻址+;

C++ C+中的非法间接寻址+;,c++,dictionary,stl,iterator,C++,Dictionary,Stl,Iterator,我不明白为什么会出现非法间接寻址错误: #include <iostream> #include <algorithm> #include <stack> #include <unordered_map> using namespace std; int main() { string s1 = ""; stack<char> s; unordered_map<char, char> m;

我不明白为什么会出现非法间接寻址错误:

#include <iostream>
#include <algorithm>
#include <stack>
#include <unordered_map>

using namespace std;

int main()
{
    string s1 = "";
    stack<char> s;
    unordered_map<char, char> m;

    m.insert('(', ')');
    m.insert('{', '}');
    m.insert('[', ']');

    for (auto x : s1)
    {
        if (m.find(x) != m.end()) s.push(x);

        else 
        {
            auto it = m.find(s.top());
            if (s.empty() || (it->second) != x) { cout << "Invalid\n"; s.pop(); break; } 
        }

    }

}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
字符串s1=“”;
堆栈s;
无序地图m;
m、 插入(“(”,“)”);
m、 插入('{','}');
m、 插入(“[”,“]”);
用于(自动x:s1)
{
如果(m.find(x)!=m.end())s.push(x);
其他的
{
自动it=m.find(s.top());

如果(s.empty()| | |(it->second)!=x){cout您必须按如下方式更正插入到
无序地图中的内容:

m.insert(std::make_pair('(', ')'));
m.insert(std::make_pair('{', '}'));
m.insert(std::make_pair('[', ']'));
演示:

插入到无序地图的更多选项如下:


您必须按如下方式更正插入到无序地图中的内容:

m.insert(std::make_pair('(', ')'));
m.insert(std::make_pair('{', '}'));
m.insert(std::make_pair('[', ']'));
演示:

插入到无序地图的更多选项如下:

还有另一种方法可以“插入”到原始答案未注明的地图中,即使用
[]
运算符:

m['('] = ')';
m['{'] = '}';
m['['] = ']';
还有另一种方法可以“插入”到原始答案未注明的地图中,即使用
[]
运算符:

m['('] = ')';
m['{'] = '}';
m['['] = ']';

是否只有这样的方法才能在C++中插入一个映射?@ AdRiang08NO,也可以使用.@ AdRiAN08,如果你有C++ 11编译器<代码> ESPOTE/代码>,它将创建对象。其他的将创建对对象和拷贝/move@Steephen事实上,我在一个在线法官问题中尝试了这三种方法,发现所有的方法都是same、 make_pair的性能最好(20毫秒),而emplace的性能最慢(32毫秒)。我可以使用C++11进行判断(我可以使用基于范围的循环)“你认为这是正确的推理吗?”AdRiang08,这是有趣的!!在性能的情况下,测量是最终决策的标准。正如我所说的,我将给出一个选项作为编辑的答案,请尝试C++。是否只有这样的方法才能在C++中插入一个图?@ AdRiang08NO,也可以使用。an008如果您有C++11编译器
emplace
更好,它将在适当的位置创建对象。其他人将创建pair对象并进行复制/move@Steephen事实上,我在一个在线判断问题中尝试了所有3种方法,发现所有方法都保持不变,make_pair的表现最好(20毫秒),而emplace的表现最慢(32毫秒).并且我能够在该判断中使用C++11(我可以使用基于范围的循环).你认为我的推断正确吗?@adrian008这很有趣!!!.就绩效而言,衡量是最终决策的标准。正如我所说,我将通过编辑给出一个更多选项作为答案,请也尝试一下。如果
s1
包含不正确的内容,这将导致未定义的行为用括号开始,因为在空堆栈上调用
s.top()
,如果
s1
包含不以括号开始的内容,这将导致未定义的行为,因为在空堆栈上调用
s.top()
m['('] = ')';
m['{'] = '}';
m['['] = ']';