2012-12-06 51 views
5

Tôi có một mã số như sau:Thay thế 'std :: vector` với `std :: array`

int n; 

int get_the_number(); 
void some_computations(); 

int main() 
{ 
    n = get_the_number(); 
    some_computations() 

    return(0); 
} 
  • Các get_the_number chức năng nhận được một số đầu vào và trả về số nguyên n, mà sau cuộc gọi của nó sẽ không được sửa đổi.

  • Trong some_computation chức năng có đoạn mã sau

    std::vector<my_struct> my_array; 
    
    for(int i=0; i<n; i++) 
    { 
        my_struct struct_temp; 
    
        // fill struct_temp; 
    
        my_array.push_back(struct_temp); 
    } 
    

Câu hỏi: Kể từ khi kích thước của my_array được biết đến một tiên nghiệm, là nó có thể thay thế các std::vector với một std::array? Hơn nữa, trong trường hợp khẳng định, tôi có nên mong đợi tăng về hiệu quả không?

tôi đã cố gắng để thay thế tờ khai vector với

std::array<my_struct,n> my_array; 

nhưng tôi nhận được một lỗi: kích thước của mảng phải được liên tục. Có cách nào để tránh không?

Cảm ơn bạn rất nhiều.

Trả lời

11

std::array cần biết kích thước tại thời gian biên dịch, không áp dụng cho mã của bạn. Vì vậy, không, bạn không thể chỉ cần thay thế std::vector bằng std::array tại đây, trừ khi get_the_number() có thể trả về một ví dụ constexpr.

constexpr int get_the_number() { return 42; } 

int main() 
{ 
    std::array<int, get_the_number()> a; 
} 

Nhưng có lẽ trong trường hợp của bạn int get_the_number() lấy số được xác định khi chạy.

+0

có vẻ như Im không nhập đủ nhanh. :) –

+0

Cảm ơn bạn rất nhiều vì câu trả lời nhanh và rõ ràng. Tôi không biết về constexpr trước đây: Tôi có rất nhiều điều để học! – 888

5

Nếu bạn muốn sử dụng thực tế là chiều dài mảng của bạn là một thời gian chạy liên tục để nâng cao hiệu quả, những gì bạn muốn làm là sử dụng std::vector::reserve để dự trữ không gian cần thiết trước thời hạn để lưu bất kỳ reallocations như vector phát triển - điều này sẽ làm cho nó gần như nhanh như một array.

my_array.reserve(get_the_number()); 
some_computations() 

Hoặc nếu mảng là cục bộ cho hàm, hãy chuyển số như một tham số.

+0

Lý do 'std :: vector :: reserve' sẽ không nhanh bằng' std :: array' là nó sẽ được cấp phát trên heap thay vì stack. Phân bổ stack cho 'std :: vector' có thể đưa nó lên tới' std :: array' mặc dù nó sẽ cần được đánh giá chuẩn. – Ricky65

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