어떻게 변환합니까 std::vector<double>
A를 double array[]
?
어떻게 변환합니까 std::vector<double>
A를 double array[]
?
답변:
스펙은 이제 벡터가 요소를 연속적으로 저장하도록 보장하기 때문에 그렇게 간단한 트릭이 있습니다 .
std::vector<double> v;
double* a = &v[0];
double*
은 같은 데이터를 가리키는 단지 필요합니다 . 이 답변은 바로 그 경우에 작동합니다.
std::vector<double> v; double* a = v.data();
무엇 때문에? 당신은 명확히해야합니다 : 배열의 첫 번째 요소 또는 배열에 대한 포인터가 필요합니까?
당신이 전을 기대하는 API 함수를 호출하는 경우, 당신은 할 수있는 do_something(&v[0], v.size())
곳 v
의 벡터입니다 double
들. 벡터의 요소는 연속적입니다.
그렇지 않으면 각 요소를 복사하면됩니다.
double arr[100];
std::copy(v.begin(), v.end(), arr);
타르 arr
가 충분히 클 뿐만 아니라arr
채워지거나 초기화되지 않은 값 .
size()
함수를 사용하여 배열의 크기를 조정하려는 경우라고 생각 합니다. 이미 지적했듯이 유효하지 않습니다. new 대신 벡터를 사용하는 것이 좋지만 문제의 핵심은 벡터를 배열로 변환하는 방법입니다. std:vector
new
malloc
double arr[v.size()]
vector<double> thevector;
//...
double *thearray = &thevector[0];
이것은 표준에 따라 작동하도록 보장되지만 몇 가지주의 사항이 있습니다. 특히 범위 내에있는 thearray
동안에 만 사용하도록주의하십시오 thevector
.
empty()
그렇지 않으면 두려워하는 UB가 호출됩니다.
효과적으로 벡터는 피부 아래 배열입니다. 기능이있는 경우 :
void f( double a[]);
다음과 같이 호출 할 수 있습니다.
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
벡터를 실제 배열 인스턴스로 변환 할 필요는 없습니다.
f( &v[0] );
마지막 라인
에 관해서는 std::vector<int> vec
얻을 VEC, int*
두 가지 방법을 사용할 수 있습니다 :
int * arr = & vec [0];
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++11
data()
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
함수가 있다면 아마도 다음이 필요할 것 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;
}
}
}