Khởi tạo một vector std :: hai chiều


116

Vì vậy, tôi có những thứ sau:

std::vector< std::vector <int> > fog;

và tôi đang khởi tạo nó rất ngây thơ như:

    for(int i=0; i<A_NUMBER; i++)
    {
            std::vector <int> fogRow;
            for(int j=0; j<OTHER_NUMBER; j++)
            {
                 fogRow.push_back( 0 );
            }
            fog.push_back(fogRow);
    }

Và nó cảm thấy rất sai ... Có cách nào khác để khởi tạo một vector như thế này không?


4
Tôi muốn đề xuất triển khai vectơ 1d cho vectơ 2d nếu bạn không yêu cầu nhiều dung lượng hơn std::vector<int>::max_size(). Đây
andre

Sẽ thật tuyệt nếu ít nhất một trong những câu trả lời không liên quan đến việc sao chép vector bên trong: memset nhanh hơn memcpy (và calloc thậm chí còn tốt hơn nếu toán tử mới được nội tuyến).
Marc Glisse

Câu trả lời:


199

Sử dụng hàm std::vector::vector(count, value)tạo chấp nhận kích thước ban đầu và giá trị mặc định:

std::vector<std::vector<int> > fog(
    A_NUMBER,
    std::vector<int>(OTHER_NUMBER)); // Defaults to zero initial value

Nếu một giá trị khác 0, chẳng 4hạn, bắt buộc phải là giá trị mặc định thì:

std::vector<std::vector<int> > fog(
    A_NUMBER,
    std::vector<int>(OTHER_NUMBER, 4));

Tôi cũng nên đề cập đến việc khởi tạo thống nhất đã được giới thiệu trong C ++ 11, cho phép khởi tạo vectorvà các vùng chứa khác, sử dụng {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };

Điều gì sẽ xảy ra nếu tôi tạo lớp lưu trữ std :: vector <std :: vector <int>>dưới dạng static?
tiền đạo

39

Giả sử bạn muốn khởi tạo vectơ 2D, m * n, với giá trị ban đầu là 0

chúng tôi có thể làm điều này

#include<iostream>
int main(){ 
    int m = 2, n = 5;

    vector<vector<int>> vec(m, vector<int> (n, 0));

    return 0;
}

Vừa nhận được 'Câu trả lời hay' vì câu trả lời này. Những người khác đã đưa ra câu trả lời tương tự, nhưng những người ủng hộ câu trả lời này có thể giống với tôi khi tôi đến bài đăng này, rằng chúng tôi không nhận ra rằng một số câu trả lời khác thực sự là câu trả lời giống nhau. Tôi nghĩ có thể là do ba lý do: 1) mã này có thể được sao chép, dán và chạy ngay lập tức 2) std::làm cho nó dài hơn và mọi người có thể thích câu trả lời ngắn gọn và trực tiếp; 3) cách đặt tên dài của biến gây nhầm lẫn cho người mới bắt đầu. Tôi cũng là người mới bắt đầu, không thực sự biết chúng ta cần quan trọng như thế nào std::, cần một mã có thể chạy được để tôi biết mỗi biến có chức năng gì
Jason

35

Không có appendphương pháp nào trong đó std::vector, nhưng nếu bạn muốn tạo một vectơ chứa A_NUMBERcác vectơ của int, mỗi vectơ chứa các other_numbersố không, thì bạn có thể thực hiện điều này:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));

8

Cú pháp chung, như đã mô tả là:

std::vector<std::vector<int> > v (A_NUMBER, std::vector <int> (OTHER_NUMBER, DEFAULT_VALUE))  

Ở đây, vectơ 'v' có thể được hình dung dưới dạng một mảng hai chiều, với 'A_NUMBER' hàng, với 'OTHER_NUMBER' cột với giá trị ban đầu được đặt thành 'DEFAULT_VALUE'.

Ngoài ra, nó có thể được viết như thế này:

std::vector <int> line(OTHER_NUMBER, DEFAULT_VALUE)
std::vector<std::vector<int> > v(A_NUMBER, line)

Nhập giá trị trong vectơ 2-D tương tự như nhập giá trị trong mảng 2-D:

for(int i = 0; i < A_NUMBER; i++) {
     for(int j = 0; j < OTHER_NUMBER; j++) {
         std::cin >> v[i][j]
     }
}

Các ví dụ đã được nêu trong các câu trả lời khác ....!


3

Tôi nghĩ cách dễ nhất để thực hiện nó là:

std::vector<std::vector<int>>v(10,std::vector<int>(11,100));

10 là kích thước của vector bên ngoài hoặc toàn cục, là chính và 11 là kích thước của vector bên trong kiểu int và các giá trị ban đầu được khởi tạo thành 100! Đó là sự giúp đỡ đầu tiên của tôi trên ngăn xếp, tôi nghĩ nó giúp ích cho ai đó.


2

Giả sử bạn muốn khởi tạo một vectơ số nguyên hai chiều với n hàng và m cột, mỗi hàng có giá trị ' VAL '

Viết nó là

std::vector<vector<int>> arr(n, vector<int>(m,VAL));

VAL này có thể là một biến kiểu số nguyên hoặc hằng số chẳng hạn như 100


1

Cách tiếp cận được đề xuất là sử dụng hàm tạo lấp đầy để khởi tạo vectơ hai chiều với giá trị mặc định đã cho:

std::vector<std::vector<int>> fog(M, std::vector<int>(N, default_value));

trong đó, M và N là kích thước cho vectơ 2D của bạn.


1

c++ STLMã của tôi để khởi tạo 5*3 2-D vectorvớizero


#include <iostream>
using namespace std;
#include <vector>
int main()
{// if we wnt to initialise a 2 D vector with 0;

    vector<vector<int>> v1(5, vector<int>(3,0));

    for(int i=0;i<v1.size();i++) 
{
        for(int j=0;j<v1[i].size();j++)

           cout<<v1[i][j]<<" ";

            cout<<endl;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.