2010-04-13 75 views
2
vector<int> l; 
for(int i=0;i<10;i++){ 
    l.push_back(i); 
} 

我想要矢量只能存儲指定範圍(或集合)中的數字。 一般情況下可以這樣做嗎?如何限制C++ STL向量元素的範圍?

特別是,我想限制載體只能存儲單個數字。所以,如果我做了l[9]++(在這種情況下l[9]9),它應該給我一個錯誤或警告我。 (因爲10不是單個數字號碼)。同樣,l[0]--應該警告我。

有沒有辦法做到這一點使用C + + STL vector

+5

你似乎在這裏困惑。矢量內的元素的值與矢量本身無關。 'l [9] ++'很可能等於2,例如,如果'l [9]'之前是1。你的例子中的0和9只是數組中的索引,並且與這些索引處的值無關。 – GManNickG 2010-04-13 14:13:41

+2

在示例代碼中,'l [i]'用'i'初始化,所以我可以理解'l [9] ++'語法作爲遞增一個已經爲'9'的元素的簡寫。這不是最明確的方式,因爲它會導致混淆,雖然 – 2010-04-13 14:21:47

回答

10

另一種解決辦法是創建自己的數據類型,它提供了這種限制。當我讀你的問題時,我認爲這些限制並不屬於容器本身,而是屬於你想要存儲的數據類型。這種實現的一個例子(開始)可以如下,可能這樣的數據類型已經在現有的庫中提供。

class Digit 
{ 
private: 
    unsigned int d; 
public: 
    Digit() : d(0) {} 
    Digit(unsigned int d) 
    { 
     if(d > 10) throw std::overflow_error(); 
     else this->d=d; 
    } 
    Digit& operator++() { if(d<9) d++; return *this; } 
    ... 
}; 
+3

+1,用'throw std :: overflow_error()'代替'raise' ......但是這個方法很好 – 2010-04-13 14:25:02

+0

感謝您的注意,在那裏混合了一些python 。我更新了代碼。 – KillianDS 2010-04-13 14:35:20

+0

我很喜歡Sutter或Meyers這樣的人寫了一個很好的'ranged_integer'類,但是我找不到它。無論如何,這種解決方案的更通用的版本當然是可能的。它將從'template '開始,然後你只需從那裏插入。 – GManNickG 2010-04-13 14:50:51

2

與其他類把它包:

class RestrictedVector{ 
private: 
    std::vector<int> things; 
public: 
// Other things 
    bool push_back(int data){ 
     if(data >= 0 && data < 10){ 
      things.push_back(data); 
      return true; 
     } 
     return false 
    } 
} 
+1

這不會阻止問題的用例:增加已存在的字段。即使這是一個很好的一步... – 2010-04-13 14:22:39