2012-05-06 51 views
5

Tôi không thể tìm thấy thông tin này. Tôi đang đối phó với một tình huống kỳ lạ ở đây, nơi tôi đang ở bên trong một vòng lặp và tôi có thể nhận được một thông tin ngẫu nhiên tại bất kỳ thời điểm nào. Thông tin này phải được lưu trữ trong một vectơ. Bây giờ mỗi frame tôi phải thiết lập vector này để đảm bảo rằng tôi sẽ không exeed không gian (tôi đang viết các giá trị vào các điểm ngẫu nhiên trong vector bằng cách sử dụng chỉ mục).Thay đổi kích cỡ vector của STL

Bây giờ giả sử không có cách nào để thay đổi đoạn mã này, tôi muốn biết, liệu vectơ "bỏ qua" hàm resize() nếu tôi gửi một đối số chính xác là kích thước của vectơ? Tôi có thể tìm thông tin này ở đâu?

Trả lời

9

Từ MSDN tham khảo 1

Nếu kích thước của container là nhỏ hơn kích thước yêu cầu, _Newsize, các yếu tố được thêm vào vector cho đến khi nó đạt đến kích thước yêu cầu. Nếu kích thước của vùng chứa lớn hơn kích thước được yêu cầu, các phần tử gần cuối của vùng chứa sẽ bị xóa cho đến khi vùng chứa đạt kích thước _Newsize. Nếu kích thước hiện tại của container là giống như kích thước yêu cầu, không có hành động

ISO C++ chuẩn (trang 485 2) xác định hành vi này cho vector::resize

void resize (size_type sz , T c = T()); 

if (sz > size()) 
    insert (end() , sz - size() , c); 
else if (sz < size()) 
    erase (begin()+ sz , end()); 
else 
; // Does nothing 

Vì vậy, có, các vector bỏ qua nó và bạn không cần phải thực hiện một kiểm tra của riêng bạn.

0

Kinda-sorta.

Chỉ cần thay đổi kích cỡ một vectơ có thay đổi kích thước() chỉ có thể dẫn đến nhiều bộ nhớ đang được sử dụng bởi chính vectơ (sẽ thay đổi số phần tử được sử dụng). Nếu không có đủ chỗ trong không gian dành riêng, nó sẽ tái phân bổ (và đôi khi họ thích tự đệm một chút vì vậy ngay cả khi bạn có thể phát triển). Nếu đã có rất nhiều phòng cho kích thước yêu cầu và bất cứ điều gì padding nó muốn làm, nó sẽ không tái sinh.

Khi đặc điểm kỹ thuật nói rằng các phần tử qua cuối kích thước sẽ bị xóa, điều đó có nghĩa là tại vị trí. Về cơ bản nó sẽ gọi _M_buff [i]. ~ T() cho mỗi phần tử nó đang xóa. Vì vậy, bất kỳ bộ nhớ đối tượng của bạn phân bổ sẽ bị xóa, giả sử một destructor làm việc, nhưng không gian mà đối tượng chính nó chiếm (kích thước của nó) sẽ không được. Các vector sẽ phát triển, và phát triển, và phát triển đến kích thước tối đa bạn đã bao giờ nói với nó và sẽ không reshrink trong khi nó tồn tại.

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