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

Dan*_*anS 6 c++ size locking const vector

有没有办法固定矢量的大小,仍然改变内容?

我试过制作一个const向量,const std::vector<int> vec(10);但这阻止我改变值.

vec[3] = 3; 给出编译器错误:分配只读位置.

我还尝试使用const引用非const向量

std::vector<int> vec(10);
const std::vector<int>& vecref(vec);
Run Code Online (Sandbox Code Playgroud)

这给出了相同的编译器错误.

我希望能够在声明或初始化阶段之后修复矢量大小.我可以使用旧式阵列,但我希望能够使用矢量算法.

如果这有任何区别,我正在使用g ++.

Seb*_*ach 6

使用C++ 0x,您可以使用std :: array <>,它就像一个很好的旧数组,具有作为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());
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要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_;
};
Run Code Online (Sandbox Code Playgroud)

也可以看看:


Che*_*Alf 3

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

干杯,