首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何有效地比较C ++中的两个字符串映射

如何有效地比较C ++中的两个字符串映射
EN

Stack Overflow用户
提问于 2018-04-04 05:55:02
回答 1查看 0关注 0票数 0

我想知道是否仅仅通过应用一些标准算法就可以编写一个比较两个的短函数,std::map<string, string>并且如果所有的键 - 值(但是一些)对都是真的,则返回true。

例如,这两个地图应评估为平等

代码语言:javascript
复制
map<string,string> m1, m2;

m1["A"]="1";
m2["A"]="1";

m1["B"]="2";
m2["B"]="2";

m1["X"]="30";
m2["X"]="340";

m1["Y"]="53";
m2["Y"]="0";

假设这两个图具有相同的大小,除了由键“X”和键“Y”存储的值之外,必须将它们的所有元素进行配对比较。第一次尝试将是一个非常低效的双重嵌套for循环。我相信可以实现更好的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2018-04-04 15:48:16

我不确定你究竟在寻找什么,所以让我先给予完全的平等,然后再给出关键的平等。也许后者已经适合您的需求。

完全平等

完全平等可以使用std::equalstd::operator==std::pairs 来测试:

代码语言:javascript
复制
#include <utility>
#include <algorithm>
#include <string>
#include <iostream>
#include <map>

template <typename Map>
bool map_compare (Map const &lhs, Map const &rhs) {
    // No predicate needed because there is operator== for pairs already.
    return lhs.size() == rhs.size()
        && std::equal(lhs.begin(), lhs.end(),
                      rhs.begin());
}

int main () {
    using namespace std;

    map<string,string> a, b;

    a["Foo"] = "0";
    a["Bar"] = "1";
    a["Frob"] = "2";

    b["Foo"] = "0";
    b["Bar"] = "1";
    b["Frob"] = "2";

    cout << "a == b? " << map_compare (a,b) << " (should be 1)\n";
    b["Foo"] = "1";
    cout << "a == b? " << map_compare (a,b) << " (should be 0)\n";

    map<string,string> c;
    cout << "a == c? " << map_compare (a,c)  << " (should be 0)\n";
}

关键的平等

C ++ 2003

根据上面的代码,我们可以给std::equal呼叫添加一个谓词:

代码语言:javascript
复制
struct Pair_First_Equal {
    template <typename Pair>
    bool operator() (Pair const &lhs, Pair const &rhs) const {
        return lhs.first == rhs.first;
    }
};

template <typename Map>
bool key_compare (Map const &lhs, Map const &rhs) {
    return lhs.size() == rhs.size()
        && std::equal(lhs.begin(), lhs.end(),
                      rhs.begin(),
                      Pair_First_Equal()); // predicate instance
}

int main () {
    using namespace std;

    map<string,string> a, b;

    a["Foo"] = "0";
    a["Bar"] = "1";
    a["Frob"] = "2";

    b["Foo"] = "0";
    b["Bar"] = "1";
    b["Frob"] = "2";

    cout << "a == b? " << key_compare (a,b) << " (should be 1)\n";
    b["Foo"] = "1";
    cout << "a == b? " << key_compare (a,b) << " (should be 1)\n";

    map<string,string> c;
    cout << "a == c? " << key_compare (a,c)  << " (should be 0)\n";
}

C ++(C ++ 11)

使用新的lambda表达式,你可以这样做:

代码语言:javascript
复制
template <typename Map>
bool key_compare (Map const &lhs, Map const &rhs) {

    auto pred = [] (decltype(*lhs.begin()) a, decltype(a) b)
                   { return a.first == b.first; };

    return lhs.size() == rhs.size()
        && std::equal(lhs.begin(), lhs.end(), rhs.begin(), pred);
}

C ++(C ++ 14)

添加2014-03-12

使用新的通用lambda表达式,您可以这样做:

代码语言:javascript
复制
template <typename Map>
bool key_compare (Map const &lhs, Map const &rhs) {

    auto pred = [] (auto a, auto b)
                   { return a.first == b.first; };

    return lhs.size() == rhs.size()
        && std::equal(lhs.begin(), lhs.end(), rhs.begin(), pred);
}

作为一种风格问题,您还可以直接将C ++ 11和C ++ 14中的lambda表达式作为参数内联:

代码语言:javascript
复制
bool key_compare (Map const &lhs, Map const &rhs) {
    return lhs.size() == rhs.size()
        && std::equal(lhs.begin(), lhs.end(), rhs.begin(), 
                      [] (auto a, auto b) { return a.first == b.first; });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档