首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板类矢量擦除不起作用

模板类矢量擦除不起作用
EN

Stack Overflow用户
提问于 2012-11-16 01:30:42
回答 2查看 218关注 0票数 0

我正在做一个项目,其中包括一个手工制作的集合,使用一个具有两个类型和向量的模板类(我可能会将其更改为指针,但不是现在)。

添加和输出值可以很好地工作,而且我也可以使用彼此来访问键和值。

然而,我在删除值时遇到了问题。这是我有的代码:

代码语言:javascript
复制
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;
}

所以当我想使用它的时候,它看起来是这样的:

代码语言:javascript
复制
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“的文件中

代码语言:javascript
复制
#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");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-16 02:01:20

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

  • 您正在删除元素5而不是6。找到与所请求的键相对应的索引i之后,您可以擦除元素i-1。将erase参数更改为begin() + i以删除预期的键/值对。
  • 您的输出循环为每个可能的键打印一行,无论它是否在那里,因此这一行显示为Key : 0 Value : 0,其中删除的元素在哪里。我猜List.Exists()会查找一个值,如果找到就返回一个键,如果没有找到就返回0,如果没有找到就返回0。这种行为将导致错误:无法区分缺失元素和零值元素。

即使您出于某种原因不想使用标准的map容器,我也建议给您的容器一个类似的接口;为了让使用标准容器的人都熟悉它,我花了很多心思来使它们的接口不易被误用。

票数 1
EN

Stack Overflow用户

发布于 2012-11-16 02:02:53

这看起来非常可疑:

代码语言:javascript
复制
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。类似地,我打赌您也有一个来自list.Get的默认返回值0

我的观点是,至少list.Get()应该在请求缺少密钥时抛出一个异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13402999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档