【问题标题】:Illegal Indirection in C++C ++中的非法间接
【发布时间】:2015-07-12 13:39:29
【问题描述】:

我不知道为什么会出现非法间接错误:

#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; } 
        }

    }

}

它是映射条目的迭代器,我正在尝试访问它的值。

【问题讨论】:

  • 如果s1 包含不以括号开头的内容,这将导致未定义的行为,因为您在空堆栈上调用s.top()

标签: c++ dictionary stl iterator


【解决方案1】:

您必须更正您在unordered_map&lt;&gt; 中的插入,如下所示:

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

演示:http://coliru.stacked-crooked.com/a/a2fff8b2f36ebc3c

插入unordered_map&lt;&gt;的更多选项:

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

m.insert(std::pair<char,char>('(', ')'));
m.insert(std::pair<char,char>('{', '}'));
m.insert(std::pair<char,char>('[', ']'));

编辑

另一种选择:

m.emplace(std::make_pair('(', ')'));
m.emplace(std::make_pair('{', '}'));
m.emplace(std::make_pair('[', ']'));

【讨论】:

  • 只有这种方法可以在c++中插入地图吗?
  • @adrian008 不,你也可以使用emplace
  • @adrian008 如果你有 C++11 编译器,emplace 更可取,它将在适当的位置创建对象。其他人将创建对对象并复制/移动
  • @Steephen 我实际上在一个在线裁判问题中尝试了所有 3 个,发现所有事情都保持不变,make_pair 的性能最好(20 毫秒),而 emplace 的性能最慢(32 毫秒)。而且我可以在那个法官中使用 C++11(我可以使用基于范围的 for 循环)。你认为这是正确的推论吗?
  • @adrian008 这很有趣!!!。与绩效一样,衡量标准是最终决策的标准。正如我所说,我将通过编辑提供更多选项作为答案,也请尝试。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2016-05-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多