2012-11-15 61 views
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

K EY:1個值:3

鍵:2值:6

鍵:3值:9

鍵:4值:12

鍵:0值:0

Key:6 Value:18

Key:7 Value:21

Key :8值:24

鍵:9值:27

所有類別代碼是在報頭中,因爲模板類不能被頭和CPP之間無需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

推測'keyPtr'和'valuePtr'都是'std :: vector'實例? – Rook

+0

測試'keyPtr [i]'然後移除'keyPtr.begin()+(i-1)'看起來很可疑。而不僅僅是因爲多餘的括號。 –

+0

'keyPtr'和'valuePtr'都是'std :: vectors'。 測試'keyPtr [i]'然後'keyPtr.begin()+(i-1)'是程序檢查向量keyPtr中的值,'i'是向量中的位置。如果它找到'keyPtr [i]'和參數中的關鍵變量之間的匹配,則它使用'keyPtr.begin()+(i-1)'擦除該位置的值。 我在一個類的正常'矢量'變量上測試了這個,它正常工作。 –

回答

1

你得到所觀察到的輸出,因爲:

  • 您要刪除元件5而不是6.經發現與所請求的關鍵指標i ,那麼您將刪除元素i-1。將erase參數更改爲begin() + i以刪除預期的鍵/值對。

  • 輸出循環爲每個可能的鍵打印一行,不管它是否在那裏,因此該行說Key : 0 Value : 0刪除的元素是。我猜List.Exists()查找一個值,返回一個鍵,如果沒有找到則返回0;如果找不到鍵,List.Get()返回零。這種行爲會導致錯誤:無法從零值元素中區分缺失的元素。

即使你不想使用標準映射容器出於某種原因,我建議給你的容器一個類似的接口;以及使用標準容器的人都很熟悉,所以很多想法都讓他們的界面很難被濫用。

+0

因此,我意識到它已經開始工作。如果它們分別找不到鍵或值,那麼list.Get()和list.Exists()都會返回NULL,在整數情況下表示0意味着現在有點愚蠢。^^」 'Tvalue獲取(TKEY鍵) \t { \t \t對(INT I = 0; I <尺寸();我++) \t \t { \t \t \t如果(keyPtr [I] ==鍵) \t \t \t { \t \t \t \t返回ValuePtr中[I]; \t \t \t} \t \t} \t \t返回NULL; \t} \t TKEY是否存在(Tvalue值) \t { \t \t的for(int i = 0; I <尺寸();我++) \t \t { \t \t \t如果(ValuePtr中[I] ==值) \t \t \t { \t \t \t \t返回keyPtr [I]; \t \t \t} \t \t} \t \t返回NULL; \t}' –

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你。同樣,我敢打賭你也有list.Get的默認回報值0

我認爲,至少list.Get() shoudl如果要求缺席密鑰,會引發異常。