以 std 对作为键透明搜索 std 映射

问题描述 投票:0回答:1

如果有

std::map<std::pair<std::string, std::string>, some_type>
找到其值的最佳方法是什么?

我想最明显的就是做这样的事情:

map.find(std::make_pair(str1, str2));
但这将导致在配对构建过程中对
str1
str2
字符串进行复制构建。

我希望也许

map.find(std::make_pair(std::ref(str1), std::ref(str2)));
可以提供帮助,但不幸的是没有,这仍然会产生字符串副本。

map.find(std::make_pair(std::move(str1), std::move(str2))
应该可以工作,但我们假设这些字符串 (
str1
,
str2
) 是 const 或者不应该移动。

所以我问是否有其他方法可以进行地图搜索而不进行多余的字符串副本?

(请注意,使用 std::string_view 作为 std::map 键不是一个选项,因为映射应该拥有它的字符串。)

c++ stl stdmap
1个回答
0
投票

C++14 为

std::map::find
添加了以下重载,允许透明搜索:

template< class K >
const_iterator find( const K& x ) const;

要利用此功能,您仍然需要

std::map
拥有合适的比较器:

struct pair_less {
    bool operator()(const auto& a, const auto& b) const {
        if (a.first < b.first) return true;
        if (b.first < a.first) return false;
        return a.second < b.second;
    }
};

int main() {
    std::map<std::pair<std::string, std::string>, int, pair_less> m { /* ... */ };
    // ...
    std::string a = "a", b = "b";
    auto pos = m.find(std::make_pair(std::ref(a), std::ref(b)));
}

这个

pair_less
是完全透明的。 它可以直接比较
std::pair<X, Y>
std::pair<const X&, const Y&>

© www.soinside.com 2019 - 2024. All rights reserved.