为什么这些c ++元组不相等?

时间:2015-05-08 19:27:20

标签: c++ tuples

如果左侧部分中的每个字符串变量在后者中确实包含它们的文字等价物,那么为什么我不能得到我的信息呢?

if (make_tuple(this->currentState, inputSymbol, stackTop) == make_tuple("q0", "a", "0"))
    cout << "These tuples are equal" << endl;

我问的原因是因为我使用带有元组的映射作为键,当我尝试使用find()时,它的行为就像映射中不存在键一样,我确信这样做是因为我使用迭代器浏览了地图并显示了所有键(元组中的每个元素)。我怀疑这个错误与上面的代码有关,因为它们应该是相同的,但它们不是。 (我正在使用map.find(make_tuple(blah,blah,blah))并将其与map.end()进行比较)思考?

1 个答案:

答案 0 :(得分:1)

这是我对你的问题的最佳猜测:

const char input[] = "hello";
if (std::make_tuple(input) == std::make_tuple("hello")) {
    // won't get here
    std::cout << "equal\n";
} 

原因是tuple<>::operator==只是元素明确的平等。在这种情况下,我们有两个tuple<const char*>,但是它们指向的字符串是相同的,实际的指针本身是不同的,我们只是比较指针。

如果你希望这个能够发挥作用,那么你需要左侧是一个operator==能做正确事情的类型。比方说,std::string

const char input[] = "hello";
if (std::make_tuple(std::string(input)) == std::make_tuple("hello")) {
    // now it happens
    std::cout << "equal\n";
}

或者,由于您使用的是std::map,因此您想要使用默认的tuple<>::operator<,而是提供您自己使用的strcmp而不是原始指针<