벡터를 배열로 변환하는 방법


352

어떻게 변환합니까 std::vector<double>A를 double array[]?


9
킨다는 왜 의문을 제기합니까? 벡터를 배열로 액세스 할 수 있습니다. 벡터가하지 않는 배열은 무엇입니까?
Michael Dorgan

96
@Michael 내가 사용하는 일반적인 사용 사례는 내 코드에서 벡터를 사용하고 배열을 취하는 타사 함수를 호출해야하는 것입니다.
Michael Mrozek

7
던져지는 용어는 혼란 스럽다. 포인터는 배열이 아닙니다. 배열의 첫 번째 요소 또는 배열에 대한 포인터를 원합니까?
GManNickG

7
정말 간단한 질문입니다. 아주 간단하고 쉽게 해석 할 수있는 질문이기도합니다. 다시여십시오.
dbliss

10
"이유가 왜 그런지 궁금해?" -먼저, 그 문구를 오용합니다. 둘째, 분명한 이유가 있습니다.
짐 발터

답변:


533

스펙은 이제 벡터가 요소를 연속적으로 저장하도록 보장하기 때문에 그렇게 간단한 트릭이 있습니다 .

std::vector<double> v;
double* a = &v[0];

29
@ganuke 복사하지 않고 벡터가 내부적으로 사용하는 실제 배열을 가리키는 포인터를 만들고 있습니다. 복사 할 경우 G 맨의 대답은 방법에 대해 설명
마이클 Mrozek

4
@ganuke : "어레이"란 무엇입니까? 자세한 정보를 제공해야합니다. 큰 그림은 무엇입니까?
GManNickG

6
@ganuke 당신은, 당신 double*은 같은 데이터를 가리키는 단지 필요합니다 . 이 답변은 바로 그 경우에 작동합니다.
Michael Mrozek

6
@guneykayim 벡터는 그 메모리를 소유하고 있습니다, 당신은 그것을 해제해서는 안됩니다
Michael Mrozek

23
std::vector<double> v; double* a = v.data();
sinoTrinity

148

무엇 때문에? 당신은 명확히해야합니다 : 배열의 첫 번째 요소 또는 배열에 대한 포인터가 필요합니까?

당신이 전을 기대하는 API 함수를 호출하는 경우, 당신은 할 수있는 do_something(&v[0], v.size())v의 벡터입니다 double들. 벡터의 요소는 연속적입니다.

그렇지 않으면 각 요소를 복사하면됩니다.

double arr[100];
std::copy(v.begin(), v.end(), arr);

타르 arr가 충분히 클 뿐만 아니라arr 채워지거나 초기화되지 않은 값 .


15
참고 : v.size ()를 사용하여 새 배열의 요소 수를 가져옵니다. double arr [v.size ()];
rbaleksandar

7
@rbaleksandar : 배열은 상수가 아닌 표현 크기를 가질 수 없습니다.
GManNickG

@GManNickG : 작동하지만 여기에 약간의 오해가 있다고 생각합니다. 다음을 상상해보십시오. 배열을 가리켜 야하는 다양한 유형의 포인터가있는 클래스가 있습니다.이 클래스는 클래스를 정의 할 때 알려지지 않았으며 나중에 다양한 벡터를 플러시하고 크기 매개 변수를 사용하여 생성됩니다 사용할 공간의 양을 결정합니다. 또 다른 예 : 간단한 함수 void arrayTest (unsigned int arrSize). 크기에 함수 매개 변수를 사용하여 배열 (짧은 arr [arrSize];)을 작성합니다.
rbaleksandar

1
@rbaleksandar 오해 없음; C ++ 11 및 이전 버전에서는 배열 크기가 정수 상수 식이어야합니다. 함수 예제는 C의 VLA에 일반적으로 사용되지만 C ++의 비표준 확장에서만 지원됩니다. 그래도 C ++ 14에 올 수 있습니다 : stackoverflow.com/a/17318040/87234 . 그러나 현재로서는 표준 옵션이 아닙니다.
GManNickG

1
@GManNickG @Jet은 벡터를 배열로 변환 하려면 사용 하거나 수행 해야하는 size()함수를 사용하여 배열의 크기를 조정하려는 경우라고 생각 합니다. 이미 지적했듯이 유효하지 않습니다. new 대신 벡터를 사용하는 것이 좋지만 문제의 핵심은 벡터를 배열로 변환하는 방법입니다. std:vectornewmallocdouble arr[v.size()]
RyanP


17
vector<double> thevector;
//...
double *thearray = &thevector[0];

이것은 표준에 따라 작동하도록 보장되지만 몇 가지주의 사항이 있습니다. 특히 범위 내에있는 thearray동안에 만 사용하도록주의하십시오 thevector.


4
... 벡터가 아닌지 확인하십시오. empty()그렇지 않으면 두려워하는 UB가 호출됩니다.
sbi

13

효과적으로 벡터는 피부 아래 배열입니다. 기능이있는 경우 :

void f( double a[]);

다음과 같이 호출 할 수 있습니다.

vector <double> v;
v.push_back( 1.23 )
f( &v[0] );

벡터를 실제 배열 인스턴스로 변환 할 필요는 없습니다.


1
나는 당신이 의미가 생각하는 f( &v[0] );마지막 라인
마이클 Mrozek을

10

에 관해서는 std::vector<int> vec얻을 VEC, int*두 가지 방법을 사용할 수 있습니다 :

  1. int * arr = & vec [0];

  2. int * arr = vec.data ();

유형 T벡터 를로 변환 T* array하려면 위의 int를로 바꿉니다 T.

나는 위의 두 가지가 왜 잘 이해되는지를 보여줄 것입니까?

std::vector 본질적으로 동적 배열입니다.

아래와 같은 주요 데이터 멤버 :

template <class T, class Alloc = allocator<T>>
class vector{
    public:
        typedef T          value_type;
        typedef T*         iterator;
        typedef T*         pointer;
        //.......
    private:
        pointer start_;
        pointer finish_;
        pointer end_of_storage_;

    public:
        vector():start_(0), finish_(0), end_of_storage_(0){}
    //......
}

range (start_, end_of_storage_)벡터가 할당 된 모든 메모리 어레이이고;

range(start_, finish_)벡터가 사용 된 모든 메모리 어레이이고;

range(finish_, end_of_storage_)백업 메모리 어레이이다.

예를 들어, 벡터 vec에 관해서. {9, 9, 1, 2, 3, 4}가있는 포인터는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

따라서 &vec[0]= start_ (주소) (start_는 int * 배열 헤드와 동일)

에서 멤버 함수 만 start_을 반환c++11data()

pointer data()
{ 
     return start_; //(equivalent to `value_type*`, array head)
}

2

data () 메소드를 사용하여이 작업을 수행 할 수 있습니다. C ++ 11은이 방법을 제공합니다.

코드 스 니펫

#include<bits/stdc++.h>
using namespace std;


int main()
{
  ios::sync_with_stdio(false);

  vector<int>v = {7, 8, 9, 10, 11};
  int *arr = v.data();

  for(int i=0; i<v.size(); i++)
  {
    cout<<arr[i]<<" ";
  }

  return 0;
}


1

함수가 있다면 아마도 다음이 필요할 것 foo(&array[0], array.size());입니다.. 배열이 필요한 상황에 처한 경우 리팩토링해야하며 벡터는 기본적으로 확장 배열이므로 항상 사용해야합니다.


-1

이런 식으로 할 수 있습니다

vector <int> id;
vector <double> v;

if(id.size() > 0)
{
    for(int i = 0; i < id.size(); i++)
    {
        for(int j = 0; j < id.size(); j++)
        {
            double x = v[i][j];
            cout << x << endl;
        }
    }
}

v [i] [j]; 2D 어레이
Sakthi Vignesh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.