我正在开发一个项目,其中包含一个手工制作的一组排序,使用一个模板类,有两种类型和向量(我可能会更改为指针,但目前不会)。
添加和输出值工作正常,我也可以使用彼此访问键和值。
但是我在删除值方面遇到了问题。这是我的代码:
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");
}
答案 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)
将返回false
,cout
将转换为0
} 为了你。同样地,我打赌你的0
的默认返回值也是list.Get
!
我认为,至少list.Get()
shoudl会在被要求缺少密钥时抛出异常。