Porównynywanie danych z vectorów

0

Dlaczego "*it2" dochodzi do szóstego elementu i znowu wraca do pierwszego, i tak sześć razy. Powinien dojść do szóstego elementu i zakończyć pętlę.

http://zapodaj.net/761ebfa023edf.png.html

1

.begin()-1 - nie wiadomo co dostaniesz, na ile pamiętam - UB. @Endrju - będzie wiedział na 100% a nawet poda numerek z dokumentacji :)
Może napisz co próbujesz wykrzesać?

0

Zakładając, że begin()-1 prowadzi do UB (nie chce mi się szukać), dalszy przebieg wydarzeń jest prawdopodobnie taki:

Kompilator podczas analizy kodu przyjmuje, że bloki zawierające dające się udowodnić UB się nigdy nie wykonują. Jest tak dlatego, że samo zapisanie w kodzie czegoś co jest UB jeszcze nie oznacza że program ma UB. Dopiero w momencie gdy wykonanie kodu z UB staje się nieuniknione, program wykazuje UB.
Zatem zakładamy, że oba bloki z begin()-1 się nigdy nie wykonują. (niewykonanie kodu z UB może być jak najbardziej jednym z objawów niezdefiniowanego zachowania)
A więc nigdy nie wykonują się także oba it2++, a więc iterator stoi w miejscu, nigdy nie osiągnie end(), czyli pętla jest nieskończona i można ją skompilować jako nieskończoną.
Tyle analizy. Z jakiegoś jednak powodu kompilator nie wyrzucił bloków z kodu (być może ustawione parametry optymalizacji nie pozwalają na wyrzucanie martwego kodu) i bloki się wykonują. Jednak sama pętla jest nieskończona.

0

Co to znaczy UB?

 it = wylosowanie_liczby.begin()-1 
  • chcę tym osiągnąć to, że po tej czynności pętla wykonuje się od początku i dodaje jeden(przesuwa o jeden), więc w taki sposób mogę ustawić początek.
0

it = wylosowanie_liczby.begin(); - po czym jakoś pominąć ++it.
Albo zmienić algorytm, mam przeczucie że jest mocno przekombinowany, a przeważnie przeczucia mnie nie zawodzą.

1

chcę tym osiągnąć to, że po tej czynności pętla wykonuje się od początku i dodaje jeden(przesuwa o jeden), więc w taki sposób mogę ustawić początek.

Przerobić kod z iteratorów na indeksy, i wtedy zinkrementowane -1 daje 0 i jest w porządku.

0

Czemu nie chesz zrobić tego po ludzku:

for(i=0,it=wylosowane_liczby.begin();it!=wylosowane_liczby.end();++it)
  {
   for(it2=twoje_liczby.begin();it2!=twoje_liczby.end();++it2,++i)
     {
      cout<<i<<". "<<*it2<<" == "<<*it<<endl;
      if(*it==*it2)
        {
         ++trafienia;
         wygrana+=50;
        }
     }   
  }

Poza tym zastanów się nad tym: http://ideone.com/dXBIT3

#include <iostream>
using namespace std;

typedef uint64_t bitlist;

void setbit(bitlist &group,unsigned bit) { group|=(1LL<<bit); }

bitlist makebitlist(initializer_list<unsigned> lst)
  {
   bitlist ret=0;
   for(unsigned i:lst) setbit(ret,i); 
   return ret;
  }

template<class InputIterator> bitlist makebitlist(InputIterator first,InputIterator last) // do kopiowania z kontenerów
  {
   bitlist ret=0;
   while(first!=last) setbit(ret,*first++);
   return ret;
  }

unsigned bitcount(bitlist group)
  {
   unsigned count;
   for(count=0;group;++count) group&=(group-1);
   return count;
  }

int main()
  {
   bitlist a=makebitlist({1,2,3,13,17,33});
   bitlist b=makebitlist({4,13,17,33,38,40});
   bitlist c=a&b;
   cout<<"wspolnych "<<bitcount(c)<<endl;
   return 0;
  }
1

W kodzie OP zarówno begin jak i end są błędne.

Tzn.

wylosowane_liczby.begin() - 1 // zaglądanie do nieswojego obszaru
wylosowanie_liczby.end() - 1 // jeśli wylosowane_liczby jest puste (a w tej pętli może być) to jest to to samo co powyżej

Poza tym nie "it++" a "++it": http://antonym.org/2008/05/stl-iterators-and-performance.html

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.