我正在做一个项目,其中包括一个手工制作的集合,使用一个具有两个类型和向量的模板类(我可能会将其更改为指针,但不是现在)。
添加和输出值可以很好地工作,而且我也可以使用彼此来访问键和值。
然而,我在删除值时遇到了问题。这是我有的代码:
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之间拆分。有没有什么我应该检查的,或者是与头文件中的代码有关?
EDIT:这是我用来获得输出的代码。它在一个名为"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");
}发布于 2012-11-16 02:01:20
您可以获得观察到的输出,因为:
i之后,您可以擦除元素i-1。将erase参数更改为begin() + i以删除预期的键/值对。Key : 0 Value : 0,其中删除的元素在哪里。我猜List.Exists()会查找一个值,如果找到就返回一个键,如果没有找到就返回0,如果没有找到就返回0。这种行为将导致错误:无法区分缺失元素和零值元素。即使您出于某种原因不想使用标准的map容器,我也建议给您的容器一个类似的接口;为了让使用标准容器的人都熟悉它,我花了很多心思来使它们的接口不易被误用。
发布于 2012-11-16 02:02:53
这看起来非常可疑:
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。类似地,我打赌您也有一个来自list.Get的默认返回值0!
我的观点是,至少list.Get()应该在请求缺少密钥时抛出一个异常。
https://stackoverflow.com/questions/13402999
复制相似问题