2011-07-08 37 views
6

Có cách sửa chữa kích thước của vec-tơ và vẫn thay đổi nội dung không?sửa (khóa) kích thước của tiêu chuẩn :: vector

Tôi đã thử tạo một vector const const std::vector<int> vec(10); nhưng điều đó ngăn tôi thay đổi các giá trị.

vec[3] = 3; cho lỗi trình biên dịch: gán vị trí chỉ đọc.

Tôi cũng đã thử với một tham chiếu const để một vector không const

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

đó cho cùng một lỗi biên dịch.

Tôi muốn có thể sửa kích thước véc-tơ trên khai báo hoặc sau giai đoạn khởi tạo. Tôi có thể sử dụng một mảng cũ, nhưng tôi muốn có thể sử dụng các thuật toán vectơ.

Tôi đang sử dụng g ++ nếu điều đó tạo ra bất kỳ sự khác biệt nào.

+1

gì "thuật toán vector" Bạn muốn sử dụng không?Bất cứ điều gì trong '' làm việc với một std :: vector có kích thước cố định, sẽ làm việc với một mảng đơn giản, vì các thuật toán đối phó trong các trình lặp hơn là các thùng chứa. –

+0

Tôi đang sử dụng 'find_if',' for_each' và một vài thứ khác. Tôi đã không nhận ra rằng tôi có thể sử dụng chúng với các mảng đơn giản. – DanS

+0

Nếu bạn tìm thấy ở đây là một câu trả lời tốt, bạn nên chấp nhận một :) –

Trả lời

3

Nhúng vào một đối tượng chỉ cung cấp các thao tác bạn muốn cho phép.

Cheers & h.,

1

Bạn có thể làm cho một const vector of pointers, và thay đổi các đối tượng chúng trỏ tới. Không nói đây là câu trả lời đúng, chỉ là nó có thể.

1

Hãy xem boost.array, nó cung cấp cho bạn một mảng kích thước cố định với ngữ nghĩa vector (ngoại trừ bất kỳ thứ gì có thể thay đổi kích thước của mảng).

+0

"ngữ nghĩa vector" là gây hiểu nhầm và sai. push_back, pop_back, thay đổi kích thước và nhiều thứ khác không được hỗ trợ bởi boost.array. –

+0

@phresnel: vâng, tất nhiên. Đã chỉnh sửa để tăng cường bản chất kích thước cố định của mảng. – Ferruccio

+1

Vâng, công bằng push_back không thể được hỗ trợ bởi câu trả lời * any * cho câu hỏi của người đăng, vì nó theo định nghĩa làm thay đổi kích thước của mảng. – jcoder

6

Với C++ 0x, bạn có thể sử dụng std :: array <>, giống như một mảng cũ tốt, với lợi ích bổ sung là vùng chứa STL, do đó cho phép nhiều thuật toán std ::.

Hoặc, bạn có thể muốn thử tăng :: mảng.

Lưu ý rằng đó cũng là std::tr1::array<>.


chỉnh sửa:

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

Sau đó, tại sao không này (minh hoạ):

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

Ngoài ra, nếu bạn cần thiết lập lại() ngữ nghĩa, nhưng muốn cấm thay đổi kích thước() et al, bạn có thể viết bộ điều hợp vùng chứa:

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

Xem thêm:

+0

Một lợi ích khác của C++ 11 là 'std :: begin' và' std :: end', cũng hoạt động với các mảng kích thước cố định chuẩn cũ, như 'int [5]', do đó cũng cho phép sử dụng ' std :: thuật toán' và 'std :: số' trong số các ưu điểm khác của stl. –

Các vấn đề liên quan