C ++ <int> vektörünü <çift> vektörüne dönüştür


98

Ne dönüştürmek için iyi bir temiz yoldur std::vector<int> intVeciçin std::vector<double> doubleVec. Veya, daha genel olarak, dönüştürülebilir türlerdeki iki vektörü dönüştürmek için?

Yanıtlar:


174

std::vectorAralık yapıcısını kullanın :

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

Yani, std::copy(...)o zaman işlevi de kullanabilir misin? Bunu cevaba ekler misin?
Alan Turing

3
@Lex: copy(v_int.begin(), v_int.end(), back_inserter(v_float));veyav_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
Jon Purdy

1
kötü fikir, çünkü yapıcı sürümü, bunların rastgele erişim yineleyicileri olduğunu not etmek için yineleyici kategorisini kullanarak vektörü önceden boyutlandıracak ve ardından yeterli alan ayıracaktır. Kopyalamadan önce yeniden boyutlandırma gereksiz bir sıfır başlatmadır.
Michael Goldshteyn

1
@MichaelGoldshteyn Anlamıyorum - boyutu önceden belirtmezseniz, kapasite aşıldığında otomatik olarak yeniden boyutlandırılacaktır (tüm öğeleri tekrar tekrar kopyalar). Tamam, bu amorti edilmiş lineer zamandır, ama bahse girerim ki bu hala tek bir 0-başlatmadan çok daha yavaştır. Tartışmanızla ilgili bir şey mi kaçırıyorum?
Algoman

2
@Algoman bkz. std::distance()"Bu bir rastgele erişim yineleyicisiyse, işlev bunu hesaplamak için işleci kullanır. Aksi takdirde, işlev art arda artırma işlecini (işleç ++) kullanır." Yani bu durumda yineleyiciler çıkarılarak elemanların miktarı bulunabilir. Standart kitaplığın bir ilk rezerv () için std :: distance kullanılıp kullanılmayacağı başka bir sorudur, ancak godbolt.org/z/6mcUFh en azından std :: distance () çağrısı içerir.
user1556435

0

std::transformAlgoritma kullanın :

std::transform(intVec.begin(), intVec.end(), doubleVec.begin(), [](int x) { return (double)x;});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.