模板类矢量擦除不工作

时间:2012-11-15 17:30:42

标签: c++ class templates vector erase

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

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

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

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

Key:2 Value:6

Key:3 Value:9

Key:4 Value:12

Key:5 Value:15

Key:6 Value:18

Key:7 Value:21

Key:8 Value:24

Key:9 Value:27

找到值5:15

删除值6

键:0值:0

键:1值:3

Key:2 Value:6

Key:3 Value:9

Key:4 Value:12

键:0值:0

Key:6 Value:18

Key:7 Value:21

Key:8 Value:24

Key:9 Value:27

所有类代码都在标头中,因为如果没有cpp文件中的main方法,则无法在header和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");
}

2 个答案:

答案 0 :(得分:1)

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

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

  • 您的输出循环为每个可能的键打印一行,无论它是否在那里,因此该行表示Key : 0 Value : 0删除的元素所在的行。我猜List.Exists()查找一个值,如果找到则返回一个键,如果不找到则返回零,如果找不到该键,则List.Get()返回零。这种行为会导致错误:没有办法将缺失的元素与零值元素区分开来。

即使您出于某种原因不想使用标准地图容器,我建议为您的容器提供类似的界面;除了熟悉使用标准容器的人之外,还有很多想法让他们的界面难以滥用。

答案 1 :(得分: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 } 为了你。同样地,我打赌你的0的默认返回值也是list.Get

我认为,至少list.Get() shoudl会在被要求缺少密钥时抛出异常。

相关问题