pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

C++ unordered_map 在使用向量作為鍵時失敗

C++ unordered_map fail when used with a vector as key(C++ unordered_map 在使用向量作為鍵時失敗)
本文介紹了C++ unordered_map 在使用向量作為鍵時失敗的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

背景:我來自 Java 世界,我對 C++ 或 Qt 相當(dāng)陌生.

Background: I am comming from the Java world and I am fairly new to C++ or Qt.

為了玩轉(zhuǎn)unordered_map,我編寫了以下簡單程序:

In order to play with unordered_map, I have written the following simple program:

#include <QtCore/QCoreApplication>
#include <QtCore>
#include <iostream>
#include <stdio.h>
#include <string>
#include <unordered_map>

using std::string;
using std::cout;
using std::endl;
typedef std::vector<float> floatVector;

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    
    floatVector c(10);
    floatVector b(10);
    
    for (int i = 0; i < 10; i++) {
        c[i] = i + 1;
        b[i] = i * 2;
    }
    
    std::unordered_map<floatVector, int> map;
    
    map[b] = 135;
    map[c] = 40;
    map[c] = 32;
  
    std::cout << "b -> " << map[b] << std::endl;
    std::cout << "c -> " << map[c] << std::endl;
    std::cout << "Contains? -> " << map.size() << std::endl;
    
    return a.exec();
}

不幸的是,我遇到了以下沒有啟發(fā)性的錯誤.甚至連行號都沒有.

Unfortunately, I am running into the folowing error which isn't inspiring. There is not even a line number.

:-1: 錯誤: collect2: ld 返回 1 個退出狀態(tài)

:-1: error: collect2: ld returned 1 exit status

知道問題的根源嗎?

推薦答案

§23.2.5,第 3 段,說:

§23.2.5, paragraph 3, says:

每個無序關(guān)聯(lián)容器由 Key 參數(shù)化,通過滿足 Hash 要求(17.6.3.4)的函數(shù)對象類型 Hash 并充當(dāng)參數(shù)的哈希函數(shù)Key 類型的值,并通過一個二元謂詞 Pred 誘導(dǎo) Key 類型的值的等價關(guān)系.

Each unordered associative container is parameterized by Key, by a function object type Hash that meets the Hash requirements (17.6.3.4) and acts as a hash function for argument values of type Key, and by a binary predicate Pred that induces an equivalence relation on values of type Key.

使用 vector 作為 Key 并且不提供明確的哈希和等價謂詞類型意味著默認(rèn)的 std::hash>std::equal_to> 將被使用.

Using vector<float> as Key and not providing explicit hash and equivalence predicate types means the default std::hash<vector<float>> and std::equal_to<vector<float>> will be used.

等價關(guān)系的std::equal_to很好,因為向量有一個運(yùn)算符==,這就是std::equal_to 使用.

The std::equal_to for the equivalence relation is fine, because there is an operator == for vectors, and that's what std::equal_to uses.

然而,沒有 std::hash<vector<float>> 特化,這可能就是你沒有向我們展示的鏈接器錯誤所說的.您需要提供自己的哈希器才能使其正常工作.

There is however, no std::hash<vector<float>> specialization, and that's probably what the linker error you didn't show us says. You need to provide your own hasher for this to work.

編寫這種散列器的一種簡單方法是使用 boost::hash_range:

An easy way of writing such an hasher is to use boost::hash_range:

template <typename Container> // we can make this generic for any container [1]
struct container_hash {
    std::size_t operator()(Container const& c) const {
        return boost::hash_range(c.begin(), c.end());
    }
};

然后你可以使用:

std::unordered_map<floatVector, int, container_hash<floaVector>> map;

當(dāng)然,如果您需要在映射中使用不同的相等語義,則需要適當(dāng)?shù)囟x散列和等價關(guān)系.

Of course, if you need different equality semantics in the map you need to define the hash and equivalence relation appropriately.

1.但是,在對無序容器進(jìn)行散列時要避免這種情況,因為不同的順序會產(chǎn)生不同的散列值,并且無法保證無序容器中的順序.

這篇關(guān)于C++ unordered_map 在使用向量作為鍵時失敗的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數(shù)據(jù)?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫 for() 循環(huán): for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環(huán)?)
Reusing thread in loop c++(在循環(huán) C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環(huán)形?)
主站蜘蛛池模板: 期货软件-专业期货分析软件下载-云智赢 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 一级建造师培训_一建培训机构_中建云筑建造师培训网校 | 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | 沈飞防静电地板__机房地板-深圳市沈飞防静电设备有限公司 | 浙江筋膜枪-按摩仪厂家-制造商-肩颈按摩仪哪家好-温州市合喜电子科技有限公司 | 2025第九届世界无人机大会| 温州在线网| 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 软文世界-软文推广-软文营销-新闻稿发布-一站式软文自助发稿平台 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 新疆十佳旅行社_新疆旅游报价_新疆自驾跟团游-新疆中西部国际旅行社 | 【黄页88网】-B2B电子商务平台,b2b平台免费发布信息网 | 航空铝型材,7系铝型材挤压,硬质阳*氧化-余润铝制品 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 耐压仪-高压耐压仪|徐吉电气| 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 地图标注|微信高德百度地图标注|地图标记-做地图[ZuoMap.com] | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 广东风淋室_广东风淋室厂家_广东风淋室价格_广州开源_传递窗_FFU-广州开源净化科技有限公司 | 管理会计网-PCMA初级管理会计,中级管理会计考试网站 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 深圳办公室装修,办公楼/写字楼装修设计,一级资质 - ADD写艺 | 行吊_电动单梁起重机_双梁起重机_合肥起重机_厂家_合肥市神雕起重机械有限公司 | 雄松华章(广州华章MBA)官网-专注MBA/MPA/MPAcc/MEM辅导培训 | 福州甲醛检测-福建室内空气检测_环境检测_水质检测-福建中凯检测技术有限公司 | 天命文免费算命堂_自助算命_自由算命系统_长文周易 | 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 博博会2021_中国博物馆及相关产品与技术博览会【博博会】 | 太空舱_民宿太空舱厂家_移动房屋太空舱价格-豪品建筑 | 石栏杆_青石栏杆_汉白玉栏杆_花岗岩栏杆 - 【石雕之乡】点石石雕石材厂 | 膜结构_ETFE膜结构_膜结构厂家_膜结构设计-深圳市烨兴智能空间技术有限公司 | 品牌广告服务平台,好排名,好流量,好生意。 | 营养师网,营养师考试时间,报名入口—网站首页 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 耐高温硅酸铝板-硅酸铝棉保温施工|亿欧建设工程 |