【问题标题】:push_back into vector within hash map classhashmap 类中向量中的 push_back
【发布时间】:2015-07-12 07:53:28
【问题描述】:

我正在尝试使用以下 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 返回空向量,即使在使用 push_back 之后也是如此。这是为什么?我该怎么做才能将项目推入向量中?

【问题讨论】:

    标签: c++ vector hashmap


    【解决方案1】:

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

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

    返回一个Data,也就是说编译器将return语句中的值复制到函数调用的局部变量中。即,每次调用 hash.find(2) 都会给出一个空向量的新副本。然后,您正在修改新创建的空向量。在push_back 完成后,向量被破坏,因为它没有绑定的左值;这是暂时的。

    将你的函数修改为:

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

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

    【讨论】:

    • 我将如何使引用不会失效?
    • 您需要创建自己的迭代器类型,它保存指向原始对象的(共享)指针——一旦发生重新分配,您就可以访问数组。不过,这是不平凡的、较慢的,而且可能没有必要这样做,因为您可以要求(如标准一样)仅在下一次插入之前使用引用。
    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2016-11-16
    相关资源
    最近更新 更多