Posunutí hodnot ve vectoru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Posunutí hodnot ve vectoru – C / C++ – Fórum – Programujte.comPosunutí hodnot ve vectoru – C / C++ – Fórum – Programujte.com

 

MiCizek0
Stálý člen
4. 11. 2013   #1
-
0
-

Ahoj, rád bych se zeptal, jak nejrychleji posunout všechny hodnoty ve vectoru. Př. Mám vector o velikosti 10 a všechny hodnoty potřebuji posunout  o  dvě doleva. Tak aby hodnota s klíčem č. 2 měla klíč č. 0, aby hodnota s klíčem č. 3 měla klíč č. 1 a hodnoty s klíčem č. 8,9 měly hodnotu 0. Pracuji na programu, který by měl umět streamovat velký svět do menšího.

Nahlásit jako SPAM
IP: 89.24.203.–
KIIV
~ Moderátor
+43
God of flame
4. 11. 2013   #2
-
0
-

no pravdepodobne skoncis u neceho jako zkopirovat si ty hodnoty, co chces presunout do tempu (dalsi vektor), smazani z puvodniho, a insert toho tempu na zacatek... nebo pokud to nebude velky, pouzit obousmerny list

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
4. 11. 2013   #3
-
0
-

Nebyla by vhodnější fronta - queue?

Když jsem kdysi něco vyváděl na 8051, použil jsem kus paměti a měl uložený ukazatel na nejstarší aktuální data a ukazatel na místo kam vkládat nová data a "běhal" jsem v tom kousku paměti dokola bez časově náročného posouvání, tuším, že se tomu říká kruhový buffer.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
vitamin+8
Grafoman
4. 11. 2013   #4
-
0
-
Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
MiCizek0
Stálý člen
5. 11. 2013   #5
-
0
-

A kdybych chtěl s pomocí rotate rotovat 2d vector? Program mi vždycky spadne.

Nahlásit jako SPAM
IP: 89.24.203.–
vitamin+8
Grafoman
5. 11. 2013   #6
-
0
-

#5 MiCizek
Ak máš na mysli niečo ako vector<vector<int>> tak stačí rotovať každý vnútorný vektor:

#include <iostream>
#include <algorithm>
#include <iterator>

int main(){
    std::vector<std::vector<int>> vec{{1,2,3,4,5}, {1,2,3,4,5}, {1,2,3,4,5}};

    //rotuje kazdy podvektor:
    for(auto& v : vec)
        std::rotate(v.begin(), v.begin()+2, v.end());

    //vypis:
    for(auto& v : vec){
        std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, ", "));
        std::cout << '\n';
    }
    return 0;
}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
MiCizek0
Stálý člen
5. 11. 2013   #7
-
0
-

Akorát úplně nechápu zápis 

for(auto& v:vec)

Předpokládám, že všechny prvky vectoru vec postupně uloží do  pomocného vectoru v a na nich provede funkci rotate.

Za druhé já tvořím fraktálový generátor map, který funguje velmi dobře. Ale plánuju, že bych ho použil ve skutečném grafickém enginu a momentálně planuju, že když se hráč posune, tak se mapa taky posune a nová část posunuté mapy se dogeneruje. A proto potřebuju v každém snímku řešit jenom část smyčky. Proto souřadnici x potřebuju zadávat ručně bez smyčky.

Nahlásit jako SPAM
IP: 89.24.203.–
vitamin+8
Grafoman
5. 11. 2013   #8
-
0
-

#7 MiCizek 

//iterujes cez vsetky prvky vektora vec. Nevytvara kopie prvkov ale referencie, preto je tam &
for(auto& v : vec)v = /*...*/; 

//cez iteratory:
for(auto i = vec.begin(); i != vec.end(); ++i)*i = /*...*/;

//cez index:
for(int i = 0; i < vec.size(); ++i)vec[i] = /*...*/;

//cez std::for_each:
std::for_each(v.begin(), v.end(), [](std::vector<int>& v){  //tiez nevytvara kopiu
    v = /*...*/; 
});
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
5. 11. 2013   #9
-
0
-

To je novinka z C++11?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
vitamin+8
Grafoman
5. 11. 2013   #10
-
0
-

#9 hlucheucho
Ano.

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
5. 11. 2013   #11
-
0
-

#10 vitamin
Nemáš odkaz, ze kterého by se dalo C++11 nastudovat?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MiCizek0
Stálý člen
5. 11. 2013   #12
-
0
-

Jenom, že mi to při tomhle tom zápisu spadne. 

std::rotate(pixels.at(*pGen->x).begin(), pixels.at(*pGen->x).begin() + CELLS, pixels.at(*pGen->x).end())
Nahlásit jako SPAM
IP: 89.24.203.–
KIIV
~ Moderátor
+43
God of flame
5. 11. 2013   #13
-
0
-
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
5. 11. 2013   #14
-
0
-

#11 hlucheucho
Pekny prehľad je tu: http://en.wikipedia.org/wiki/C++11

Konkrétnejšie príklady si nájdeš na nete.

#12 MiCizek
Padne ti to pri dereferencovaní pGen->x, alebo až po zavolaní rotate? Ak je CELLS väčšie ako veľkosť vektora tak to môže spadnúť.

Sprehľadniť a možno aj zrýchliť by sa to dalo takto:

auto& v = pixels.at(*pGen->x);
std::rotate(v.begin(), v.begin() + CELLS, v.end())
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
MiCizek0
Stálý člen
5. 11. 2013   #15
-
0
-

Spadne mi to i když napíšu:

cout << pixels.size() << endl;
cout << pixels.at(0).size() << endl;
std::rotate(pixels.at(0).begin(), pixels.at(0).begin() + 1, pixels.at(0).end());

a obě dimenze mají velikost 512. Spadne mi to vždycky, když k pixels.at(0).begin() přičtu jakékoliv číslo.

Nahlásit jako SPAM
IP: 89.24.203.–
vitamin+8
Grafoman
5. 11. 2013   #16
-
0
-

#15 MiCizek
Skusil som nieco taketo a toto nepada:

#include <iostream>
#include <algorithm>
#include <iterator>

const auto CELLS = 6;

int main(){
    std::vector<std::vector<int>> vec(512, std::vector<int>(512, 0));

    auto& v = vec.at(5);
    std::rotate(v.begin(), v.begin()+ (CELLS % vec.size()), v.end());

    std::cout << "OK\n";
    return 0;
}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
MiCizek0
Stálý člen
5. 11. 2013   #17
-
0
-

Zjistil jsem, ze problem nastane, když se zavola jeden z operatoru new nebo delete v konstructoru/destructoru struct, co je prvkem vectoru.

Nahlásit jako SPAM
IP: 89.24.203.–
vitamin+8
Grafoman
5. 11. 2013   #18
-
0
-

#17 MiCizek
Mas kopirovaci konstruktor?

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
5. 11. 2013   #19
-
0
-

nevoláš delete na něco co neexistuje?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MiCizek0
Stálý člen
5. 11. 2013   #20
-
0
-

#18 vitamin
aha :-D

Nahlásit jako SPAM
IP: 89.24.203.–
MiCizek0
Stálý člen
5. 11. 2013   #21
-
0
-

Stejně to padá při volání deleta v destructoru.

Nahlásit jako SPAM
IP: 89.24.203.–
vitamin+8
Grafoman
5. 11. 2013   #22
-
0
-

#20 MiCizek

Tak sem postni tu tvoju triedu.

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
MiCizek0
Stálý člen
5. 11. 2013   #23
-
0
-

   


struct CPixel
{
	CPixel ()
	{
		pixelHeight = new UNSHORT;
		pixelType = new TYPETERRAIN;
		index = new UNSHORT;
		*pixelHeight = 0;
		*pixelType = gtt_Empty;
		*index = 0;
	};
	~CPixel()
	{
		delete pixelHeight;
		delete pixelType;
		delete index;
	}
	CPixel (CPixel *right)
	{
		pixelHeight = new UNSHORT;
		pixelType = new TYPETERRAIN;
		index = new UNSHORT;
		*pixelHeight = *right->pixelHeight;
		*pixelType = *right->pixelType;
		*index = *right->index;
	};
	UNSHORT *pixelHeight;
	TYPETERRAIN *pixelType;
	UNSHORT *index;
};
*height = CELLSCALE*CELLS;
*width = CELLSCALE*CELLS;
pixels.resize(*height);
for (UNSHORT i = 0; i < *height; i++) {
	pixels.at(i).resize(*width);
Nahlásit jako SPAM
IP: 89.24.203.–
vitamin+8
Grafoman
5. 11. 2013   #24
-
0
-

#23 MiCizek
Kopirovaci konstruktor ma takyto tvar:

MenoTriedy(const MenoTriedy& x);

Ty vobec nepotrebujes dynamicky alokovat premenne:

struct CPixel
{
	UNSHORT pixelHeight = 0;
	TYPETERRAIN pixelType = gtt_Empty;
	UNSHORT index = 0;
};
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
MiCizek0
Stálý člen
5. 11. 2013   #25
-
0
-

protoze je to ve vectoru?

Nahlásit jako SPAM
IP: 89.24.203.–
vitamin+8
Grafoman
5. 11. 2013   #26
-
0
-

#25 MiCizek
new a delete je relativne pomale lebo musi riesit fragmentaciu heapu. Dalej musis vytvarat konstruktor, destructor a copy ctor aby trieda/struktura spravne fungovala. Zaroven bude struktura vecsia lebo v nej mas pointre na data ktore zaberaju 8B (pri 64bit systeme) + data na heape a pristup k nim bude pomalsi lebo musis dereferencovat pointer a data na heape nemusia ist za sebou takze ani cache pamet sa nepotesi :)

Tomuto vsetkemu sa vyhnes ak pouzies tu strukturu co som sem dal predtym.

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
MiCizek0
Stálý člen
5. 11. 2013   #27
-
0
-

to vím, že když dynamicky allocuju paměť, tak je to pomalejší. Ale zase pro nedynamicky allocovanou paměť je omezenější velikost ne?

Nahlásit jako SPAM
IP: 89.24.203.–
vitamin+8
Grafoman
5. 11. 2013   #28
-
0
-

#27 MiCizek

Dynamicky alokovat mozes celu triedu:

new CPixel;
//alebo cele pole:
new CPixel[20];

Vector interne dynamicky alokuje pole prvkov.

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
MiCizek0
Stálý člen
5. 11. 2013   #29
-
0
-

Jinak děkuju, teď se mi to zase celé rozbilo, ale to je asi u programováni normální. :-)

Nahlásit jako SPAM
IP: 89.24.203.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 24 hostů

Podobná vlákna

Vector ve vectoru — založil cibule

Kopirovani prvku ve vectoru — založil DooFy93

Posunutí — založil erter

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý