Permalänk
Medlem

c++ std::find

Hej!

sitter och gemför std::binary_search och std::find. En sak jag upptäckte är att om man använder find, så kommer anta värdet 0(antar att om de redan fins någor i minnes sällen den starta iteratorn på så kommer den innehålla de värdet istället) fall den inte hittar något i den iteratorn. de är ju inge problem om man lägger en if sats på föjlande sätt:

if((*it)!=0) { cout << "hittade: " << värdet_som_ den_sökte << endl; }

men då är frågan säg att vi söker värdet 0 i en vector<int>, hur skulle men då kunna avgöra om den verkligen hittat den eller ej?

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

Nej, find returnerar den andra iteratorn som du skickar som argument om inget element hittas, se referens. Dvs. om du har en "vector<int> v" och anropar find som "it = find(v.begin(), v.end(), 17)", så returneras v.end() ifall 17 inte kunde hittas. Att ta värdet av t.ex. vector::end är odefinierat, om den råkar vara 0 så är det bara ren tur. Oftast så kommer ditt program att krascha om du gör så.

Permalänk
Medlem

ok, tack för att du berättade det!, men skulle du kunna utveckla de du säger med "oftas så kommer ditt program krasha om du gör så" vad menar du med gör så?, tänker du på min ifsats eller tänker, eller för att den inte hitta de jag söker?

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem
Skrivet av Mejan:

ok, tack för att du berättade det!, men skulle du kunna utveckla de du säger med "oftas så kommer ditt program krasha om du gör så" vad menar du med gör så?, tänker du på min ifsats eller tänker, eller för att den inte hitta de jag söker?

vector::end är en iterator som pekar på elementet som kommer efter det sista elementet i vectorn, dvs. ett element som inte finns. Den används t.ex. när man itererar över en vector, så att man vet när man gått igenom alla element. Eftersom elementet som iteratorn pekar på inte existerar så är det odefinierat vad som händer om du försöker ta värdet av den. Odefinierat betyder att precis vad som helst kan hända, t.ex. att du får tillbaks 0 eller att ditt tangentbord fattar eld. Det troligaste är dock att ditt program bara kraschar för att du försöker läsa minne som inte är allokerat.

find kan ju dock användas för att söka igenom andra spann än hela vectorn, så om slut-iteratorn pekar på ett element i vectorn istället för end så får du ju tillbaks en iterator som du kan ta värdet av. Men du kan som du var inne på ändå inte använda det värdet för att avgöra om ett element hittades av find, eftersom värdet kanske inte är unikt i vectorn.

Permalänk
Medlem

Det han istället borde göra är att använda den andra iteratorn för att kolla typ.

if( it != vector.end() ) { .... }

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem
Skrivet av NoPaiN^:

Det han istället borde göra är att använda den andra iteratorn för att kolla typ.

if( it != vector.end() ) { .... }

okej, men om jag fårståt detta rätt så är .end() i detta fall en vector en minneplats om inte är något av de inlästa värdena?

så därför funkar detta if vilkor?

så fall vill jag påstå att detta är löst!

vill tacka er båda, ni har vart i stor hjälp för mig!

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6