簡體   English   中英

c++ 標准::map<std::string, int> 與 std::string_view 一起使用</std::string,>

[英]c++ std::map<std::string, int> use at with std::string_view

假設我有一個std::map<std::string, int> 有什么方法可以將其at方法與std::string_view使用? 這是一個代碼片段:

std::string_view key{ "a" };
std::map<std::string, int> tmp;
tmp["a"] = 0;
auto result = tmp.at(key);

這是我從 clang 12.0 獲得的 output

錯誤:沒有匹配的成員 function 用於調用“at”

自動結果 = tmp.at(key);

發生這樣的事情需要三件事:

  1. 地圖的比較器必須是透明比較器(需要 C++14,但您已經在使用string_view ,即 C++17,所以這是一個有爭議的問題)。

  2. 當容器具有透明比較器時, at()方法必須具有參與重載解析的重載。

  3. 該參數必須可轉換為地圖的key_type

在您的示例中,這些都不正確。 默認的std::less比較器不是透明比較器, at()沒有這樣的重載,並且std::string沒有來自std::string_view的隱式轉換。

您對at()無能為力,但是您可以對比較器做一些事情, 即使用 (透明std::void比較器) ,然后使用find()而不是at() ,它確實有一個合適的重載:

#include <map>
#include <string>
#include <string_view>


int main()
{
    std::string_view key{ "a" };
    std::map<std::string, int, std::less<void>> tmp;
    tmp["a"] = 0;

    auto iter=tmp.find(key);
}

更完整的演示

沒有從std::string_viewstd::string隱式轉換,這就是你得到“沒有匹配的成員函數”錯誤的原因。 請參閱:為什么沒有從 std::string_view 到 std::string 的隱式轉換?

有一個std::string構造函數將接受std::string_view作為輸入,但是它被標記為explicit ,所以你必須這樣做:

auto result = tmp.at(std::string(key));

演示

如果您想將地圖的operator[]std::string_view一起使用,則相同:

tmp[std::string(key)] = ...;
auto result = tmp[std::string(key)];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM