2 차원 std :: vector 초기화


116

그래서 다음이 있습니다.

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

그리고 나는 그것을 매우 순진하게 초기화하고 있습니다.

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

그리고 그것은 매우 잘못된 것 같습니다 ... 이와 같은 벡터를 초기화하는 다른 방법이 있습니까?


4
보다 많은 공간이 필요하지 않은 경우 2d 벡터에 1d 벡터 구현을 권장합니다 std::vector<int>::max_size(). 여기
andre

적어도 하나의 답변이 내부 벡터 복사를 포함하지 않았다면 좋았을 것입니다.
Marc Glisse

답변:


199

std::vector::vector(count, value)초기 크기와 기본값을 허용하는 생성자를 사용하십시오 .

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

4예를 들어 0이 아닌 값 이 기본값이어야하는 경우 :

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

또한 다음을 vector사용하여 및 기타 컨테이너 의 초기화를 허용하는 C ++ 11에서 균일 한 초기화가 도입되었음을 언급해야합니다 {}.

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

std :: vector <std :: vector <int>>as 의 스토리지 클래스를 만들면 어떻게 static됩니까?
스트라이커

39

2D 벡터 m * n을 초기화하고 초기 값을 0으로 설정한다고 가정 해 보겠습니다.

우리는 이것을 할 수있다

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

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

    return 0;
}

이 답변 때문에 '좋은 답변'을 받았습니다. 다른 사람들은 이미 같은 답변을했지만,이 게시물을 올렸을 때이 답변을 찬성하는 사람들은 다른 답변이 실제로 같은 답변이라는 것을 인식하지 못했던 저와 비슷할 수 있습니다. 그 이유는 세 가지 때문이라고 생각합니다. 1)이 코드를 복사하고 붙여넣고 바로 실행할 수 있습니다. 2) std::코드를 더 길게 만들고 사람들은 짧고 직접적인 대답을 좋아할 수 있습니다. 3) 변수의 긴 이름 지정은 초보자를 혼란스럽게합니다. 저도 초보자입니다. 우리가 얼마나 중요한지 잘 모르겠습니다. std::실행 가능한 코드 가 필요 하므로 각 변수가 무엇을하는지 알고 있습니다
Jason

35

아무없는 append방법에는 std::vector, 그러나 당신이 포함하는 벡터 만들고 싶어 A_NUMBER의 벡터를 int포함하는 각각의 other_number0을, 당신은이 작업을 수행 할 수 있습니다

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

8

이미 설명 된 일반 구문은 다음과 같습니다.

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

여기서 벡터 'v'는 초기 값이 'DEFAULT_VALUE'로 설정된 'OTHER_NUMBER'개의 열과 함께 'A_NUMBER'개의 행이있는 2 차원 배열로 시각화 될 수 있습니다.

또한 다음과 같이 작성할 수 있습니다.

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

2 차원 벡터에 값을 입력하는 것은 2 차원 배열에 값을 입력하는 것과 유사합니다.

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

예는 이미 다른 답변에서 언급되었습니다 ....!


3

가장 쉬운 방법은 다음과 같습니다.

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

10은 주 벡터 인 외부 또는 전역 벡터의 크기이고 11은 int 유형의 내부 벡터 크기이며 초기 값은 100으로 초기화됩니다! 그것은 스택에 대한 나의 첫 번째 도움입니다. 누군가에게 도움이 될 것 같습니다.


2

각각 값이 ' VAL '인 n 개의 행과 m 개의 열이있는 2 차원 정수 벡터를 초기화한다고 가정합니다.

다음과 같이 작성하십시오.

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

이 VAL은 정수 유형 변수 또는 100과 같은 상수 일 수 있습니다.


1

권장되는 방법은 채우기 생성자를 사용하여 지정된 기본값으로 2 차원 벡터를 초기화하는 것입니다.

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

여기서 M과 N은 2D 벡터의 차원입니다.


1

c++ STL초기화 5*3 2-D vector할 내 코드zero


#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;
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.