将_back推入哈希地图类中的向量

push_back into vector within hash map class

本文关键字:向量 地图 哈希 back      更新时间:2023-10-16

我正在尝试使用以下主体来测试我修改的哈希图类。

#include <iostream>
#include "HashMap.h"
using namespace std;
int main(){
    HashMap<int,vector<string>> hash(20);
    vector<string> vec;
    cout<<"Inserting item... ";
    if(hash.insert(2)){
       cout<<"successful. ";
       hash.find(2).push_back("word ");
       hash.find(2).push_back("is ");
       hash.find(2).push_back("pushed ");
       hash.find(2).push_back("back. ");
       hash.find(2).push_back("yes!n");
    } else {
       cout<<" unsuccessful.";
       return 0;
    }
    vec = hash.find(2);
    for(auto& words: vec)
       cout<< words<<endl;;
    return 0;
}

循环的决赛没有打印任何东西。

find函数的定义是这样的:

Data find(const Key& key) { return array[findPos( key )].data_; }

其中 Data是哈希图类类中的第二个模板变量。我进行了几个测试,即使使用push_backfind也会返回空向量。这是为什么?我该怎么做才能将项目推入向量?

问题是您的 find函数返回数据结构中值的 copy 。具体来说,

 Data find(const Key& key) { return array[findPos( key )].data_; }

返回 Data value ,也就是说,编译器将返回语句中的值复制到函数调用的本地变量。即,每个呼叫hash.find(2)的呼叫都给空置矢量提供新的副本。然后,您要修改新创建的空矢量。push_back完成后,由于没有限制的lvalue,矢量将被破坏。这是一个临时。

将功能修改为:

 Data& find(const Key& key) { return array[findPos( key )].data_; }

将完成您想要的工作,因为它将返回参考到内部数据结构。请注意,这样做有一些相关的危险。这使得同时访问更难检测,允许用户获得可能无效的参考(例如,如果调整array大小),并且通常会违反封装。但是,如果您要制作具有可变值的哈希地图,这是要走的。