C ++ vector <int>를 vector <double>로 변환


93

a std::vector<int> intVecstd::vector<double> doubleVec. 또는 더 일반적으로 두 개의 변환 가능한 유형 벡터를 변환하려면?

답변:


164

std::vector의 범위 생성자를 사용하십시오 .

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());

그렇다면 std::copy(...)함수를 사용할 수도 있습니까? 대답에 추가 할 수 있습니까?
Alan Turing

3
@Lex : copy(v_int.begin(), v_int.end(), back_inserter(v_float));v_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
존 퍼디에게

1
생성자 버전은 반복기 범주를 사용하여 벡터가 임의 액세스 반복기임을 확인한 다음 충분한 공간을 예약하여 벡터의 크기를 미리 조정하기 때문입니다. 복사하기 전에 크기를 조정하는 것은 낭비없는 초기화입니다.
마이클 Goldshteyn

1
@MichaelGoldshteyn 이해가 안가요-미리 크기를 지정하지 않으면 용량이 초과 될 때마다 자동으로 크기가 조정됩니다 (모든 요소를 ​​반복해서 복사). 좋아요, 이것은 상각 선형 시간이지만 단일 0 초기화보다 여전히 훨씬 느립니다. 내가 당신의 주장에 대해 뭔가를 놓치고 있습니까?
Algoman

1
@Algoman 참조 std::distance()"무작위 액세스 반복자 인 경우 함수는 operator-를 사용하여이를 계산합니다. 그렇지 않으면 함수는 증가 연산자 (operator ++)를 반복적으로 사용합니다." 따라서이 경우 요소의 양은 반복자를 빼서 찾을 수 있습니다. 표준 라이브러리가 초기 reserve ()에 std :: distance를 사용하도록 구현되었는지 여부는 또 다른 질문이지만 godbolt.org/z/6mcUFh 에는 적어도 std :: distance ()에 대한 호출이 포함되어 있습니다.
user1556435
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.