2011-07-08 35 views
6

有沒有一種方法來修復矢量的大小,並仍然在改變內容?修復(鎖)大小的std :: vector

我試過做一個const矢量const std::vector<int> vec(10);,但是這阻止了我改變值。

vec[3] = 3;給出一個編譯器錯誤:分配只讀位置。

我也曾嘗試用常量引用一個非const矢量

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

可以得到相同的編譯錯誤。

我希望能夠在聲明或初始化階段之後修復向量大小。我可以使用一個老式的數組,但我想能夠使用矢量算法。

我使用g ++,如果這有什麼區別。

+1

什麼 「矢量算法」 你要使用?''中的任何與固定大小的std :: vector一起工作的東西都可以使用普通數組,因爲算法在迭代器而不是容器中處理。 –

+0

我使用'find_if','for_each'和其他幾個。我沒有意識到我可以使用普通數組。 – DanS

+0

如果你發現這裏是一個很好的答案,你應該接受一個:) –

回答

3

將其嵌入到只提供您想要允許的操作的對象中。

乾杯&心連心,

1

看一看boost.array,它給你一個帶有矢量語義的固定大小的數組(除了會改變數組大小的任何東西外)。

+0

「向量語義」是誤導和錯誤的。 boost.array不支持push_back,pop_back,resize等。 –

+0

@ phresnel:是的,當然。編輯以加強陣列的固定尺寸性質。 – Ferruccio

+1

好吧公平push_back不能由*任何*回答海報的問題來支持,因爲它通過定義改變了數組的大小。 – jcoder

6

使用C++ 0x,你可以使用std :: array <>,它就像一個很好的舊數組,它有一個STL容器的附加好處,因此允許許多std ::算法。

另外,你可能想嘗試boost :: array。

注意,也有std::tr1::array<>


編輯:

Actually, one of the cases that I hadn't gone into was to grow the vector while reading configuration files and then fix the size after that - DanS

那麼,爲什麼不是這個(illustrational):

#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()); 
} 

另外,如果你需要重新設置()的語義,但要禁止調整大小()等al,你可以寫一個容器適配器:

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_; 
}; 

參見:

+0

C++ 11的另一個好處是'std :: begin'和'std :: end',它也適用於古老的標準固定大小的數組,例如'int [5]',因此也可以使用' std :: algorithm'和'std :: numeric'等stl善良。 –

相關問題