gpt4 book ai didi

c++ - 将 (string, object * ) 插入哈希表 (C++)

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:10 25 4
gpt4 key购买 nike

这个问题是我的 previous question 的副产品创建哈希表以将字符串键和指针存储为数据。当我尝试将条目添加到我的哈希表时,我在构建后遇到段错误。我仍然很困惑什么语法是合适的。

我目前有(感谢以前的海报):

// Simulation.h
#include <ext/hash_map>
using namespace __gnu_cxx;
...
typedef struct { size_t operator()( const string& str ) const
{ return __gnu_cxx::__stl_hash_string( str.c_str() ); } } strhash;

struct eqstr {
bool operator()(string s1, string s2) const {
return ( s1.compare(s2) == 0 );
}
};
....
hash_map< string, Strain *, strhash, eqstr > strainTable;

在我的模拟构造函数中,我有:

// Simulation.cpp
Simulation::Simulation() : ... {
string MRCA;
for ( int b = 0; b < SEQ_LENGTH; b++ ) {
int randBase = rgen.uniform(0,NUM_BASES);
MRCA.push_back( BASES[ randBase ] );
}
Strain * firstStrainPtr;
firstStrainPtr = new Strain( idCtr, MRCA, NUM_STEPS );
strainTable[ MRCA ]= firstStrainPtr; // <-- Hash table initialization
....
}

这似乎工作正常。尝试以下插入时出现段错误:

void Simulation::updateSimulation( double t ) {
....
// Add mutants to liveStrains() and strainTable
vector< Strain * >::const_iterator mItr = newMutants.begin();
for ( mItr = newMutants.begin(); mItr != newMutants.end(); ++mItr ) // for each mutant in deme
{
string mutantSeq = ( *mItr )->getSequence();
cout << "mutantSeq is " << mutantSeq << endl; // <-- This is fine
liveStrains.push_back( *mItr );
strainTable[ mutantSeq ] = *mItr; // <-- Seg fault happens here
}
newMutants.clear();
....
}

阅读 SGI documentation 中关于 operator[] 的第三个注释,这看起来应该没问题。怎么了?我正在考虑切换到 map 容器只是为了节省调试时间......

更新

初始化似乎有问题。当我到达时

strainTable[ mutantSeq ] = *mItr;

调试器报告“EXC_BAD_ACCESS”并跳转到

_Node* __first = _M_buckets[__n];

hashtable.h。

最佳答案

作为一种诊断方法,您实际上在线上执行了 2 条指令:

  1. strainTable 中查找,返回一个引用
  2. 解引用迭代器
  3. 为引用赋值

在这里您可能想要采用分而治之方法:

  strainTable[ mutantSeq ] = *mItr; // <-- Seg fault happens here

成为

  Strain*& aReference = strainTable[ mutantSeq ];
Strain* const aPtr = *mItr;
aReference = aPtr;

(这是一般性建议)

段错误发生在哪条线上?是否有可能获得堆栈的前 10 个帧?

在查找 Google 时,我想到了这个 bug report ,这表明 hash_map...

可能存在问题

您最好使用 unordered_map如果可能的话,因为它清楚地表明不会花时间修复被视为遗留容器的 hsah_map(这是 2005 年......)。请注意,如果您使用 GCC 4.x(不确定 3.x),它应该可用

主要优点是 hash 结构和 comparison predicate 已经适用于 std::string 所以你甚至不必自己实现它们:)

因此,如果您的编译器中有这个,您所要做的就是编写:

#include <tr1/unordered_map>

typedef std::tr1::unordered_map<std::string, Strain*> strain_hash_map;

关于c++ - 将 (string, object * ) 插入哈希表 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1651563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com