벡터를 배열로 변환하는 방법
변환 방법std::vector<double>아주double array[]?
이제 스펙은 벡터가 요소를 연속적으로 저장하도록 보장하기 때문에 그렇게 하는 데 꽤 간단한 방법이 있습니다.
std::vector<double> v;
double* a = &v[0];
뭐 때문이지요?다음 사항을 명확히 해야 합니다.배열의 첫 번째 요소 또는 배열에 대한 포인터가 필요합니까?
만약 당신이 전자를 기대하는 API 함수를 호출하고 있다면, 당신은 할 수 있습니다.do_something(&v[0], v.size()),어디에v의 벡터입니다.double벡터의 요소는 연속적입니다.
그렇지 않으면 각 요소를 복사하기만 하면 됩니다.
double arr[100];
std::copy(v.begin(), v.end(), arr);
타르 뿐만 아니라arr충분히 크지만, 그것은.arr값이 채워지거나 초기화되지 않은 값이 있습니다.
C++11의 경우, 트릭을 할 것입니다.
vector<double> thevector;
//...
double *thearray = &thevector[0];
이는 표준에 따라 작동하는 것으로 보장되지만 몇 가지 주의 사항이 있습니다. 특히 사용에 주의하십시오.thearray하는 동안에thevector범위 내입니다.
에 대하여std::vector<int> vec얻을 수 있는 벡터int*두 가지 방법을 사용할 수 있습니다.
int*ar = &vec[0];
int*ar = vec.datastore;
형식 벡터를 다음으로 변환하려는 경우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_)백업 어레이 메모리입니다.
예를 들어, {9, 9, 1, 2, 3, 4}가 포인터인 벡터 벡터는 다음과 같습니다.
그렇게&vec[0]start_ (주소) (start_는 int* 어레이 헤드와 동일합니다.)
인c++11그data()멤버 함수 그냥 start_ 반환합니다.
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
벡터는 효과적으로 피부 아래 배열입니다.기능이 있는 경우:
void f( double a[]);
다음과 같이 부를 수 있습니다.
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
벡터를 실제 배열 인스턴스로 변환할 필요는 없습니다.
std::vector<double> vec;
double* arr = vec.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;
}
기능이 있는 경우 다음이 필요할 수 있습니다.foo(&array[0], array.size());어레이가 필요한 상황에 도달한 경우 벡터는 기본적으로 확장 어레이이므로 항상 벡터를 사용해야 합니다.
당신은 이렇게 할 수 있습니다.
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;
}
}
}
언급URL : https://stackoverflow.com/questions/2923272/how-to-convert-vector-to-array
'programing' 카테고리의 다른 글
| Firebase DB에 값이 있는지 확인합니다. (0) | 2023.06.13 |
|---|---|
| E/Firebase 충돌 분석:https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/XXXX/settings 에서 설정을 검색하지 못했습니다. (0) | 2023.06.13 |
| jquery UI 대화상자: 제목 표시줄 없이 초기화하는 방법은 무엇입니까? (0) | 2023.06.13 |
| DST로 인해 Oracle 날짜 비교가 중단되었습니다. (0) | 2023.06.13 |
| 버전 제어에 Xcode 작업 공간 구성표 추가 (0) | 2023.06.13 |
