Imam par predloga, mislim nista mnogo bitno cisto informativno ako dosad nisi video.
1.
Umesto ovoga (posto brojevi idu sekvencijalno):
std::vector<int> pom;
for(int i = 0; i < 50; i++) pom.push_back(i);
mozes da iskoristis iota algo:
std::vector<int> pom(50);
std::iota(std::begin(pom), std::end(pom), 0);
2.
Posto se zna koliki je broj elemenata, zadas vektoru koliko ce da alocira u konstruktoru odjednom umesto push_back-a koji resize-uje vise puta, odnosno poziva new u alokatoru sto moze da bude relativno skupo u zavisnosti od primene.
3.
Primer sa mersenne twister random funkcijom i prosledjivanjem predicate funkcija u shuffle i sort:
void Brojevi(std::vector<krug> &a)
{
static const std::size_t max_elems = 50;
assert( max_elems >= a.size() );
static std::mt19937 mt(static_cast<unsigned int>(std::time(nullptr)));
std::uniform_int_distribution<int> tint(0, max_elems - 1);
std::function<int(int)> shuff_fun = [&](int dummy) { return tint(mt); };
std::function<bool(int,int)> sort_fun = [](int x, int y) { return x < y; };
std::vector<int> pom(max_elems);
std::iota(std::begin(pom), std::end(pom), 0);
std::random_shuffle(std::begin(pom), std::end(pom), shuff_fun);
std::sort(std::begin(pom), std::begin(pom) + a.size(), sort_fun);
for(std::size_t i = 0; i < a.size(); i++)
a[i].broj = pom[i];
}
Ne treba ti n parametar posto vektor krugova "zna" svoju velicinu.
|