修复(锁定)std :: vector的大小

时间:2011-07-08 10:47:06

标签: c++ vector locking size const

有没有办法修正矢量的大小并仍然改变内容?

我尝试过制作一个const矢量const std::vector<int> vec(10);,但这会阻止我更改值。

vec[3] = 3;给出编译器错误:指定只读位置。

我也尝试过对非const向量的const引用

std::vector<int> vec(10);
const std::vector<int>& vecref(vec);

,它给出了相同的编译器错误。

我希望能够在声明或初始化阶段之后修复矢量大小。我可以使用老式数组,但我希望能够使用矢量算法。

如果有任何不同,我正在使用g ++。

4 个答案:

答案 0 :(得分:6)

使用C ++ 0x,您可以使用std :: array&lt;&gt;,这就像一个很好的旧数组,具有作为STL容器的额外好处,因此允许许多std :: algorithms。

或者,您可能想尝试boost :: array。

请注意,还有std::tr1::array<>


编辑:

  

实际上,我没有涉及的其中一个案例是在读取配置文件的同时增长向量,然后在此之后修复大小 - DanS

然后,为什么不这样(插图):

#include <vector>

int main () {
    std::vector<int> foo;

    /* ... crunch upon foo ... */

    // make a copy vector->vector:
    const std::vector<int> bar (foo); 

    // make a copy any->vector
    const std::vector<int> frob (foo.begin(), foo.end());
}

或者,如果你需要reset()语义,但想禁止resize()等,你可以写一个容器适配器:

template <typename T, typename Allocator = allocator<T> >
class resettable_array {
public:
    // container ...
    typedef typename std::vector<T,Allocator>::iterator iterator;
    typedef typename std::vector<T,Allocator>::const_iterator const_iterator;
    ...

    iterator begin() { return vector_.begin() }
    const_iterator begin() const { return vector_.begin(); }
    ...

    void push_back (T const &v) { vector_.push_back (v); }
    ...

    // custom
    void reset () { ... }

private:
    std::vector<T,Allocator> vector_;
};

另见:

答案 1 :(得分:3)

将其嵌入到仅提供您要允许的操作的对象中。

干杯&amp;第h。,

答案 2 :(得分:1)

您可以制作const vector of pointers,并更改他们指向的对象。不是说这是正确的答案,只是有可能。

答案 3 :(得分:1)

看看boost.array,它会给你一个带有向量语义的固定大小的数组(除了会改变数组大小的任何东西)。