我正在尝试使用以下 main 来测试我修改的 HashMap 类。
#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;
}
最后的 for 循环不打印任何内容。
find
函数定义如下:
Data find(const Key& key) { return array[findPos( key )].data_; }
其中 Data
是 HashMap 类中的第二个模板变量。我运行了几个测试,find
返回空 vector ,即使在使用 push_back
之后也是如此。这是为什么?我该怎么做才能将项目插入 vector 中?
最佳答案
问题是您的find
函数返回数据结构中值的拷贝。具体来说,
Data find(const Key& key) { return array[findPos( key )].data_; }
返回一个Data
value,也就是说编译器将return语句中的值复制到函数调用的局部变量中。即,每次调用 hash.find(2)
都会提供一个空 vector 的新拷贝。然后,您将修改新创建的空 vector 。 push_back
完成后, vector 被破坏,因为它没有绑定(bind)到左值;这是临时的。
将您的函数修改为:
Data& find(const Key& key) { return array[findPos( key )].data_; }
将完成您想要的,因为它会返回对内部数据结构的引用。请注意,这样做会带来一些相关的危险。这使得并发访问更难检测,允许用户获得可能无效的引用(例如,如果您调整 array
的大小),并且通常违反封装。但是,如果您要制作具有可变值的 HashMap ,这是可行的方法。
关于c++ - push_back 到 HashMap 类中的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30004549/