반응형
vector 컨테이너의 반복자를 통해 해당 반복자가 가리키는 요소의 주소를 얻을 수 있다.
우선 벡터는 연속적인 배열이기 때문에 다음과 같이 첫 번째 원소의 주소를 통해 배열의 시작 주소를 구할 수 있다. 그리고 포인터의 특성을 이용해 모든 요소에 접근할 수 있다.
void main()
{
vector<int> v1 {1, 2, 3, 4, 5};
int* beginAddrOfV1 = &v1[0];
for(size_t i = 0; i < v1.size(); ++i)
{
cout << *(beginAddrOfV1 + i) << " ";
}
cout << endl;
}
위와 비슷한 방식으로 반복자를 통해 요소에 접근하여 주소를 구하면 해당 요소를 가리키는 포인터를 얻을 수 있다.
void main()
{
vector<int> v1{ 1, 2, 3, 4, 5 };
auto beg = v1.begin();
for (size_t i = 0; i < v1.size(); ++i)
{
cout << "[" << i << "]: " << &(*(beg + i)) << ", " << *(beg + i) << endl;
}
cout << endl;
}
기존의 주소와 비교해보면 주소값이 동일한 것을 확인할 수 있다.
void main()
{
vector<int> v1{ 1, 2, 3, 4, 5 };
int* beginAddrOfV1 = &v1[0];
auto beg = v1.begin();
for (size_t i = 0; i < v1.size(); ++i)
{
cout << "[" << i << "]: " << beginAddrOfV1 + i << ", " << &(*(beg + i))
<< ", " << *(beg + i) << endl;
}
cout << endl;
}
이러한 것을 이용해 memcpy에 vector 클래스를 적용할 수도 있다.
void main()
{
vector<pair<float, float>> src;
src.emplace_back(make_pair(1.f, 2.f));
src.emplace_back(make_pair(3.f, 4.f));
src.emplace_back(make_pair(5.f, 6.f));
vector<pair<float, float>> dest;
dest.resize(src.size());
// 반복자 이용
// memcpy(&*dest.begin(), &*src.begin(), sizeof(pair<float, float>) * src.size());
memcpy(&dest[0], &src[0], sizeof(pair<float, float>) * src.size());
for(const auto& mypair : dest)
{
cout << mypair.first << ", " << mypair.second << endl;
}
cout << endl;
}
'C,C++ > C++' 카테고리의 다른 글
[C++] bool 타입 변수 true/false 형식으로 출력하기 (0) | 2020.09.13 |
---|---|
[C++] VS2019 16.7 Ver. 안전성을 위한 새로운 코딩 규칙을 알아보자 (0) | 2020.09.11 |
[C/C++] 인자로 넘겨받은 배열로는 배열의 크기를 구할 수 없다. (0) | 2020.08.02 |
[C++] std::thread 기본 활용 방법을 알아보자 | mutex, condition_variable, 종료 방법 (2) | 2020.07.03 |
[C++] std::thread 생성에 대해 알아보자 (0) | 2020.06.26 |
댓글