提问人:Alberto Tiraboschi 提问时间:4/8/2022 最后编辑:Vlad from MoscowAlberto Tiraboschi 更新时间:4/8/2022 访问量:369
为什么无法初始化地图?
Why can't the map be initialized?
问:
给定以下代码,
#include <iostream>
#include <string>
#include <mutex>
#include <string_view>
#include <unordered_map>
struct sstruct {
std::string content;
std::string_view name;
std::mutex mtx;
sstruct(std::string content_, std::string_view name_)
: content(std::move(content_)), name(name_) {
}
std::string get_content() {
return "";
}
};
int main() {
std::unordered_map<std::string, sstruct> map{
{
"pippo", {"dddd", ""}
}
};
std::cout << map["pippo"].content << std::endl;
}
这不会编译,并出现以下错误:
C:\Users\alt\Desktop\main.cpp(23): error C2440: 'initializing': cannot convert from 'initializer list' to 'std::unordered_map<std::string,sstruct,std::hash<std::string>,std::equal_to<std::string>,std::allocator<std::pair<const std::string,sstruct>>>'
C:\Users\alt\Desktop\main.cpp(27): note: No constructor could take the source type, or constructor overload resolution was ambiguous
我想避免在构造函数中初始化互斥锁。
答:
4赞
Vlad from Moscow
4/8/2022
#1
问题在于该类既不可复制也不可移动。std::mutex
考虑重新设计你的班级,比如
struct sstruct {
std::string content;
std::string_view name;
static std::mutex mtx;
sstruct(std::string content_, std::string_view name_)
: content(std::move(content_)), name(name_) {
}
std::string get_content() {
return "";
}
};
否则,请尝试如下操作
std::unordered_map<std::string, sstruct> map;
auto [it, success] = map.try_emplace( "pippo", "dddd", "" );
if ( success )
{
std::cout << it->second.content << std::endl;
}
和
auto it2 = map.find( "pippo" );
if (it2 != map.end())
{
std::cout << it2->second.content << '\n';
}
或
auto &obj = map.at( "pippo" );
std::cout << obj.content << '\n';
评论
1赞
Alberto Tiraboschi
4/8/2022
我认为这是不可能的。我需要在地图的每个条目上都有不同的互斥锁
0赞
VLL
4/8/2022
@AlbertoTiraboschi 然后,您应该创建一个处理互斥体成员的移动构造函数。
0赞
xiaofei
4/8/2022
#2
unordered_map::operator[]
有两种情况,键存在时间和返回值;当键不存在时,将插入一个空值,并且该值的类型需要无参数构造函数
评论
0赞
xiaofei
4/8/2022
斯罗伊!!原来的答案是错误的。我修改了原来的答案
评论
sstruct
map["pippo"]
sstruct