0

私は、2つのタイプとベクトルを持つテンプレートクラスを使用して、手作りの並べ替えのセットを含むプロジェクトに取り組んでいます(ポインターに変更することはできますが、現時点では変更できません)。

値の加算と出力は正常に機能し、お互いを使用してキーと値にアクセスすることもできます。

ただし、値の削除に問題があります。これは私が持っているコードです:

bool Remove(Tkey key)
{
    for (int i = 0; i < size(); i++)
    {
        if (keyPtr[i] == key)
        {
            keyPtr.erase(keyPtr.begin() + (i-1));
            valuePtr.erase(valuePtr.begin() + (i-1));
            return true;
        }
    }
    return false;
}

そのため、使用したい場合は次のようになります。

cout << "Remove Value 6" << endl;
list.Remove(6);

ベクトルに期待するのは、それが呼び出されると、キーが6のデータが削除されることです。ただし、これを出力として取得します。

キー:0値:0

キー:1値:3

キー:2値:6

キー:3値:9

キー:4値:12

キー:5値:15

キー:6値:18

キー:7値:21

キー:8値:24

キー:9値:27

値5を見つける:15

値6を削除

キー:0値:0

キー:1値:3

キー:2値:6

キー:3値:9

キー:4値:12

キー:0値:0

キー:6値:18

キー:7値:21

キー:8値:24

キー:9値:27

テンプレートクラスは、cppファイル内にmainメソッドがないと、ヘッダーとcppの間で分割できないため、すべてのクラスコードはヘッダーにあります。チェックする必要があるものはありますか、それともヘッダー内にあるコードと関係がありますか?

編集:これは私が出力を取得するために使用しているコードです。「main.cpp」というファイルにあります

#include <iostream>
#include <vector>
#include "DictionaryList.h"

using namespace std;


void main()
{
DictionaryList<int,int> list;

for (int i = 0; i < 11; i++)
{
    list.Add(i, i*3);
}

for (int i = 0; i < 10; i++)
{
    cout << "Key    : " << list.Exists(i*3) << "    Value   : " << list.Get(i) << endl;
}

cout << "Find value 5: " << list.Get(5) << endl;

cout << "Remove Value 6" << endl;
list.Remove(6);

for (int i = 0; i < 10; i++)
{
    cout << "Key    : " << list.Exists(i*3) << "    Value   : " << list.Get(i) << endl;
}

system("pause");
}
4

2 に答える 2

1

次の理由により、観測された出力が得られます。

  • 6ではなく要素5を削除しています。i要求されたキーに対応するインデックスが見つかったら、要素を消去しますi-1erase引数をに変更しbegin() + iて、予期されるキーと値のペアを削除します。

  • 出力ループは、キーが存在するかどうかに関係なく、可能なキーごとに1行を出力します。したがって、この行Key : 0 Value : 0は、削除された要素がどこにあったかを示します。List.Exists()値を検索し、見つかった場合はキーをList.Get()返し、見つからなかった場合はゼロを返し、キーが見つからなかった場合はゼロを返すと思います。その動作はエラーにつながります。欠落している要素とゼロ値の要素を区別する方法はありません。

何らかの理由で標準のマップコンテナを使用したくない場合でも、コンテナに同様のインターフェイスを提供することをお勧めします。標準のコンテナを使用する人々に精通しているだけでなく、インターフェイスを誤用しにくくするために多くの考慮が払われました。

于 2012-11-15T18:01:20.470 に答える
0

これは非常に疑わしいようです。

for (int i = 0; i < 10; i++)
{
    cout << "Key    : " << list.Exists(i*3) << "    Value   : " << list.Get(i) << endl;
}

削除したアイテム(キー5、値15)をテストすると、list.Exists(i*3)が返されfalsecoutキャストさ0れます。同様に、デフォルトの戻り値0fromもあるに違いlist.Getありません。

私は、少なくとも、list.Get()キーがないことを要求された場合、shoudlは例外をスローするという意見です。

于 2012-11-15T18:02:53.073 に答える