Ez így helyes? És miért történik ez a furcsa dolog itt?
// main.cpp
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <algorithm>
using std::cout;
using std::endl;
using std::random_shuffle ;
typedef unsigned short int ushort;
typedef unsigned int uint;
int main(void) {
srand(ushort(time(0)));
ushort myArray[11];
for(ushort i = 1; i - 1 < 11; ++i)
myArray[i-1] = i;
random_shuffle(myArray, myArray+11);
for(ushort i = 0; i < 11; ++i)
cout << myArray[i] << " ";
return 0;
}
Abban asorban ahol a random_shuffle van ott a tömb elős elemének a címét és a tömb utolsó eleme után levő címet adtam át annak a függvénynek mert csak így veszi figyelembe a tömb utolsó elemét.
Miért működik ez így.
Mivel 0 kezdődik az indexelés ezért a tömb 10 eleme az utolsó.Nekem mégis 11 kell oda írnom ami már túlhaladja a tömböt.Mert csak a így veszi figyelembe a random_shuffle a tömb utolsó az az 10 elemét.Miért van ez így?
Legyetek szívesek még erre is válaszolni:
// main.cpp
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <algorithm>
using std::cout;
using std::endl;
using std::random_shuffle ;
typedef unsigned short int ushort;
typedef unsigned int uint;
inline const ptrdiff_t myrandom(const ptrdiff_t i) { return rand()%i; }
int main(void) {
srand(ushort(time(0)));
const ptrdiff_t (*const pMyrand) (const ptrdiff_t) = myrandom;
ushort myArray[11];
for(ushort i = 1; i - 1 < 11; ++i)
myArray[i-1] = i;
random_shuffle(myArray, myArray+11, pMyrand);
for(ushort i = 0; i < 11; ++i)
cout << myArray[i] << " ";
return 0;
}
Ebben a sorban "random_shuffle(myArray, myArray+11, pMyrand);" meghívom a myrandom függvényt aminek nem adok paraméterül semmit mégis lefordul miért?
A válasz biztosan a ptrdiff_t típusban rejlik igaz?
De akkor,hogy működik ez? Nem értem ezt a ptrdiff_t típust nagyon örülnék neki ha valaki elmagyarázná mert a talált angol leírásokból nem sikerült megértenem.
Annyit sikerült kitalálnom,hogy két mutatót kivon egymásból de ezt nem értem.
Olyan mintha a random_shuffle inicializálná a myrandom függvény argumentumát mindig a tömbben levő a legkisebbtől eggyel nagyobb értéktől a az egyel nagyobb legnagyobb értékig.Érdekes.
De nagyon furám működik ez a random_shuffle inicializál egy másik függvény egy argumentumát és a tömb utolsó utáni elemét kell neki átadni ahhoz hogy figyelembe vegye a tömbben levő utolsó elemet.
Egy: tegyél több kérdőjelet, főleg a kérdéseid végére.
Kettő: MINDEN stl-es algoritmus így működik, az intervallumot az első eleme és az utolsó utáni eleme határozza meg. Különben hogy adnál meg egy üres intervallumot?
Három:
"const ptrdiff_t (*const pMyrand) (const ptrdiff_t) = myrandom;"
"random_shuffle(myArray, myArray+11, pMyrand);"
Itt nem hívod meg a myrandom függvényt, hiszen nincs mögötte a (). A függvényhívást szerintem te is tudod, hogy hogy néz ki, és nem így. A pMyrand egy függvénypointer, és mint ilyen, egy függvény címét tárolja. Azt adod át a random_shuffle-nek, és ő meg fogja ezt hívni. Semmi köze a ptrdiff típushoz, az csak egy int (vagy hasonló, long pl).
"Különben hogy adnál meg egy üres intervallumot?"
Ezt nem értem.
Nem nagyon értem még mindig,hogy mit akarsz ezzel mondani.
Bocsi. :(
"Az algoritmusoknak úgy adod meg, hogy min dolgozzanak, hogy átadsz nekik egy intervallumot, és ezt az intervallumot az első és az utolsó utáni elemmel írod le."
Ezt a mondatodat értem az utánalevőt nem.
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f)
{
for ( ; first!=last; ++first ) f(*first);
return f;
}
A legtöbb algoritmus hasonlóan néz ki. Addig megy, amíg a first nem egyenlő a lasttal. Ez biztosítja, hogy minden elemen végigmenjen. Emellett az üres intervallumnak milye nincs az intervallum eleje és a vége után közül?
"Emellett az üres intervallumnak milye nincs az intervallum eleje és a vége után közül?"
Ezt nem bírom megérteni.
De amúgy már értem hogy miért kell a tömb utolsó eleme utáni címet megadni.
De akár úgyis lehetne,hogy <= a tömb utolsó elemével és akkor nem kéne megadni a tömb utolsó utáni elemét.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!