0

我正在开发一个项目,其中包括使用具有两种类型和向量的模板类(我可能会更改为指针,但目前不会)的手工制作的排序集。

添加和输出值工作正常,我也可以使用彼此访问键和值。

但是我在删除值时遇到了问题。这是我的代码:

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 之间拆分,而 cpp 文件中没有 main 方法。有什么我应该检查的,还是与标题中的代码有关?

编辑:这是我用来获取输出的代码。它在一个名为“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

您得到观察到的输出,因为:

  • 您正在删除元素 5 而不是 6。找到i与请求的键对应的索引后,您可以擦除 element i-1erase将参数更改为begin() + i以删除预期的键/值对。

  • 您的输出循环为每个可能的键打印一行,无论它是否存在,因此该行说明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()如果要求缺少密钥,应该抛出异常。

于 2012-11-15T18:02:53.073 回答