C++ unordered_map<T,int> 如何区分空单元格和 0
C++ unordered_map<T, int> how to distinguish null cell from 0
假设我有一个unordered_map<string, int> H
。
假设H中没有元素" House",因此cout<<H["house"];
会打印0。
,假设我需要分配H["house"] = 0
。
我将如何区分一个不存在的元素与0?
//example of what I want:
if(!H["house"]){
cout<<"DOES NOT EXIST YETn";
H["house"] = 0;
}
if(H["house"]){
cout<<"IT EXISTS NOWn";
}
在std::unordered_map
中,operator[]
如果不存在元素,则修改地图。这是为了允许诸如H["house"] = 0
之类的简单分配语句工作。查找时,您真的不想要这个。
相反,您应使用H.find
,或使用H.at
。find
返回一个迭代器,如果找不到元素,它将等于H.end()
,否则可以为该值删除。如果找不到元素,则at
会引发错误。
最短测试:
if (H.count("house")) {
// "house" exists
} else {
// "house" does not exist in H
}
auto itr = H.find("house");
if (itr == H.end())
{
// "house" does not exist in H
}
else
{
// "house" exists
// itr->second = the same as H["house"]
}
如果您可以访问boost
,则可以将可选参考返回映射类型的小功能很有用。如果您有最近的C 实现,则可以使用std::optional
。
template<class K, class V, class H, class E, class A, class Lookup>
auto
maybe_at(std::unordered_map<K,V,H,E,A> const& m, Lookup&& key)
-> boost::optional<V const&>
{
boost::optional<V const&> result;
auto i = m.find(key);
if (i != m.end())
result = i->second;
return result;
}
使用的示例:
#include <unordered_map>
#include <boost/optional.hpp>
#include <iostream>
#include <string>
template<class K, class V, class H, class E, class A, class Lookup>
auto
maybe_at(std::unordered_map<K,V,H,E,A> const& m, Lookup&& key)
-> boost::optional<V const&>
{
boost::optional<V const&> result;
auto i = m.find(key);
if (i != m.end())
result = i->second;
return result;
}
void emit(boost::optional<const int&> oi)
{
if (oi)
{
std::cout << *oi << std::endl;
}
else
{
std::cout << "{null}" << std::endl;
}
}
int main()
{
std::unordered_map<std::string, int> m;
m["house"] = 0;
emit(maybe_at(m, "house"));
emit(maybe_at(m, "donkey"));
}
相关文章:
- 将QIcon添加到QTableView单元格
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 查找矩阵中单元格的相邻元素
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 当我使用需要计算数组单元格地址的模板时,奇怪的C++行为
- PyQT - 在 QTableWidget 单元格中显示垂直文本
- 2D 数组,某些单元格保存特定数据
- 为什么通过定义另一个指针单元格,整个代码停止工作?
- CLI/C++dataGridView示例-设置comobox单元格列表的索引
- 用单元格表示迷宫
- 为什么不能使用 setData() 在 QTreeView 中设置单元格的背景颜色?
- 将 GtkTreeView 中的单元格设置为以编程方式编辑模式
- 如何防止Qt中的当前单元格更改信号或跳过"processing"?
- 将当前多边形数据单元与下一个多边形单元格 - VTK 进行比较
- VTK:尝试使用 vtkrubberbandpick&vtkHardwareSelector 选择区域中的可见单元格
- QTableWiget::cellChanged 信号不会为具有 QTableWidgetItem 的单元格发出
- 当存在空单元格时,用于 c++ 的 Tsv 文件解析器会突然结束
- C++ unordered_map<T,int> 如何区分空单元格和 0
- 基于单元格代替QTableWidget中的一行
- 如何修改VTKPolyData中的单元格中的一个点