c++ - push_back 到 HashMap 类中的 vector

标签 c++ vector hashmap

我正在尝试使用以下 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/

相关文章:

java - 使用JAVA高效查找JSON中的键值

c++ - 为什么我们需要strcpy()?

c++ - 输入迭代器的值初始化

c++ - 使用 Eigen header 的模板函数

c++ - vector 序列化

c++ - 以某种方式用质数填充 vector

c++ - 链接器错误 2001 未解析的外部符号

java - 在Java中序列化键值对的HashMap并将其转换为格式化字符串

java - textArea.setText() 错误输出

c++ - 我可以删除以前动态分配但指针不同的内存吗?