Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C++ Kopírovanie dynamicky alokovaného vektora do iného vektora

Experimentujem s C++ snažím sa skopírovať dynamicky alokovaný vector<char> obsahujúci binárne dáta do iného vector<char>.

Použil som na to funkciu std::copy a skúsil som to aj so smart pointerom aj s bežným pointerom.

Zdroják je tu: https://pastebin.com/40ZBdDKD

1. Zistil som, že keď je cieľový vektor menší ako zdrojový, tak ho musím zvačšiť... Prečo je to tak? Nedá sa nejako docieliť, aby som ho nemusel resizovať, aby si ho resizla priamo kopírovacia funkcia? Alebo treba použiť inú funkciu, ktorá kontroluje veľkosť cieľového vektora? Všimol som si ešte, že sa na kopírovanie používa std::assign a taktiež konštruktor triedy vektor obsahuje možnosť klonovania. Čo sa používa najviac?

2. Ako sa emulujú moduly v C++? Viem že C++ od verzie 20 bude obsahovať plnohodnotné moduly ale čo do vtedy? (ja mám len 17ku) Mám použiť statický class / struct so statickými metódami?

3. Všimnite si "modul" binarydata_console funkciu overloadujem extra pre vector<char>* a extra pre shared_ptr<vector<char>> nedalo by sa to nejako automatizovat pomocou templatov?

Předmět Autor Datum
1. Pokud ta funkce copy pracuje tak, že si bere adresu začátku a konce zdrojové kolekce a iterátor c…
GTS 28.09.2019 18:58
GTS
Dik za odpovede. 2. moduly... C++ bude mat od verzie 20 moduly na styl funkcionalnych jazykov. tera…
box456 28.09.2019 20:12
box456
2. takže ti jde čistě o viditelnost prvků z jiných souborů? Jediné, co ti tak můžu poradit je keywor… poslední
GTS 28.09.2019 20:44
GTS

1. Pokud ta funkce copy pracuje tak, že si bere adresu začátku a konce zdrojové kolekce a iterátor cílové kolekce, tak musí být logicky cíl alespoň tak velký jako zdroj, jinak by to rvala mimo alokovanou paměť (proto je podle mě vhodá tak max. na hloupá pole v C, tady bude asi lepší použít standardní kopírující konstruktor vectoru - třeba *smart_vec2 = *smart_vec1)
2. nerozumím otázce :-)
3. tohle by se většínou řešilo raw pointerem - https://en.cppreference.com/w/cpp/memory/shared_ptr/get, nebo lépe referencí.., templatem by to šlo taky

Dik za odpovede.

2. moduly... C++ bude mat od verzie 20 moduly na styl funkcionalnych jazykov. teraz ma len namespaces alebo staticke triedy. https://vector-of-bool.github.io/2019/03/10/modules-1.html ale v C++ 17 zatial nie su podporovane v MSVC sa nejakym hackom daju zapnut ale neni to zatial oficialne podporovana funkcionalita.

3. islo mi o to ako sa taketo veci robia v templatoch lebo ja som C++ zaciatocnik. S generikami mam skusenosti z inych jazykov ale predsa len templaty su na inom leveli.

2. takže ti jde čistě o viditelnost prvků z jiných souborů? Jediné, co ti tak můžu poradit je keyword static - dostupnost jen z daného file (mimo členy tříd, kde to má jiný efekt), - vím že jsem tohle exportování používal kdysi v JS, popravdě jsem to v C++ nikdy nehledal :-)
3. v tomhle případě asi vážně ten klasický raw pointer, ale obecně k templatům asi nejsem ta správná osoba na rady - příjdou mi v C++ udělané hrozně - chybí mi tam restrikce, jako ve vyšších jazycích (z čeho má typ dědit atp.) - když nad tím daným objektem voláš konkrétní metody, raději bych místo template použil třeba pointer na nějakého předka, který ty metody zaručeně implementuje a využil polymorfismus

Zpět do poradny Odpovědět na původní otázku Nahoru