![](/img/trans.png)
[英]c++ : convert std::map<std::string, double> to std::map<std::string_view, double>
[英]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);
發生這樣的事情需要三件事:
地圖的比較器必須是透明比較器(需要 C++14,但您已經在使用string_view
,即 C++17,所以這是一個有爭議的問題)。
當容器具有透明比較器時, at()
方法必須具有參與重載解析的重載。
該參數必須可轉換為地圖的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_view
到std::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.