2010-04-13 50 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