读取关联数组中的值会创建一个新键

时间:2010-06-28 16:52:54

标签: visual-c++ visual-studio-2008 stl

我有这样的代码。我用

pvalueholder是多态的类,它可以包含所有类型的字符串..字符串.. 它也可以有一个未定义的类型。

typedef hash_map<pvalueholder,pvalueholder,pvaluehasher > hashtype;
hashtype h;
pvalueholder v;
v="c";
h[v]=5; // h has one element

pvalueholder v2=h[v]; // here h gets a new key/value how is that possible?
cout << (string) (h[v]) << endl; // here h gets another new key/value how is that possible?
int i =0;
for (hashtype::iterator h1=h.begin(); h1!=h.end();h1++)
{
  cout << "no: " << i++ << endl;
} // this prints three lines, it should print one...

这里有两个值未定义,第三个值是预期的5。

 size_t pvaluehasher::operator() (const pvalueholder& p) const
  {
      cout << "hashvalue:" <<  p.value->hashvalue() << endl;
   return p.value->hashvalue();

  }

返回 这是印刷的内容: 散列值:84696444 散列值:84696444 散列值:84696444 回报:1 散列值:84696444 回报:1 散列值:84696444 回报:1 回报:1 散列值:84696444

你有什么想法吗? 谢谢。

解决方案: 在Microsoft STL的情况下,函数operator()(parameter1,parameter2)需要不同。 对于microsoft,它需要返回少于parameter1和parameter2之间的关系。 对于gcc,它需要返回相等性。我恢复了平等。 键的比较功能不正确...... 该函数返回true表示相等,但必须返回的时间小于Microsoft STL。

3 个答案:

答案 0 :(得分:2)

我的猜测是你的哈希函数不正确 - 这意味着它给出相同的键"c"会产生不同的哈希值。

显示pvalueholder的声明和pvaluehasher的完整代码。

答案 1 :(得分:2)

几乎不可能对hash_map发表评论,因为它从未被标准化,现有的实现并不完全一致。更糟糕的是,您的代码似乎不正确或可编译 - 有些地方与键相关的值似乎是一个int,而其他地方则是一个字符串。

使用std::tr1::unordered_map并修复其余代码进行编译并且看似合理,如下所示:

#include <unordered_map>
#include <iostream>
#include <string>

using namespace std;

typedef std::tr1::unordered_map<std::string, int> hashtype;

std::ostream &operator<<(std::ostream &os, std::pair<std::string, int> const &d) { 
    return os << d.first << ": " << d.second;
}

int main() {
    hashtype h;
    std::string v = "c";

    h[v]=5; // h has one element

    int v2=h[v]; 
    cout << h[v] << endl;
    int i =0;
    for (hashtype::iterator h1=h.begin(); h1!=h.end();h1++)
    {
      cout << *h1 << endl;
    } // this prints three lines, it should print one...

    return 0;
}

我得到的输出是:

5
c: 5

这似乎很合理 - 我们只按预期插入了一个项目。

答案 2 :(得分:0)

解决方案:在Microsoft STL的情况下,函数operator()(parameter1,parameter2)需要不同。对于microsoft,它需要返回少于parameter1和parameter2之间的关系。对于gcc,它需要返回相等性。我恢复了平等。键的比较函数不正确...函数返回true表示相等,而且必须返回少于Microsoft STL的函数。