2

私は C++ を初めて使用し、HashTables を使用してプログラムを作成しています。これは宿題です。HashTables を使用して作成するのはこれが初めてなので、何をしているのか完全にはわからないことをあらかじめご容赦ください。私が今抱えている主な問題は、自分のremove()機能を組み込むことです。コードをコンパイルすることはできますが、プログラムのテストを実行するとクラッシュします。私が受け取っているエラー

リスト反復子はデクリメントできません

私の削除機能は、教授から提供された挿入機能に基づいています。いくつかのことを変更しただけです。これが私のクラスHTableと私のremove()機能です。

class HTable
{
public:
    HTable(int size);
    void insert(  const string &s);
    void remove(string key);

private:
    vector<list<string>> List;
    int currSize;
    int tableSize;
    int hash(const string &key);
    int hashFunction(string key);
    int HTableSize;
    int *status_arr;
    ostream &   operator <<( ostream &);
};

remove()関数

inline void HTable::remove(string key)
{
    list<string> List;

    if( find( List.begin( ), List.end( ), key )  ==  List.begin( ) )
    {
        List.pop_back();
    }
}
4

3 に答える 3

0

正確な値を見つけてリストから削除しているので、標準のテンプレート ライブラリを使用する方が簡単です。

C++98 の場合、オブジェクトの等価性をチェックする述語オブジェクトを作成します。

struct string_equal
{
   string_equal(const std::string& tgt) : target(tgt)
   {}

   bool operator()(const std::string& key) const
   {
      return key == target;
   }

   const std::string& target;
};

void remove(const std::string& key)
{
   // find the appropriate list in your vector
   list<string>& List = get_correct_list_for_key(key);

   list<string>::iterator new_end = std::remove_if(List.begin(), List.end(), string_equal(key));

   List.erase(new_end, List.end());
}

C++11 では、ラムダを使用してこれをさらに簡単に行うことができます。

void remove(const std::string& key)
{
   list<string>& List = get_correct_list_for_key(key);

   auto new_end = std::remove_if(List.begin(), List.end(),
     [&] (const std::string& target) -> bool { return target == key; });

   List.erase(new_end, List.end());
}
于 2013-04-11T01:56:58.297 に答える
0

リストを逆方向にたどりたい場合は、rbegin と rend を使用して逆イテレータを取得します (これが必要な場合は、そうです - 場合によっては、より良い、より速い場合もあります: コンテキストによって異なります)。

for (std::list<...>::reverse_iterator it=list.rbegin(); it!=list.rend(); ++it)

自動も使用できます。

for( auto it=list.rend(); it!=list.rbegn(); ++it ) {...}

于 2013-04-10T23:49:18.517 に答える