Permalänk
Medlem

Vector c++

Om jag lagrar en struct-variabel i en vector, och sedan vill söka i den. Hur ska jag göra funktionen för att plocka fram en hel plats med alla struct-variabeln om jag bara söker på en del av struct-variablern i vectorn?

Permalänk
Medlem

Humm, är lite osäker på vad du menar men find_if kanske gör det du vill? http://www.cplusplus.com/reference/algorithm/find_if/

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk
Hedersmedlem
Skrivet av Athkore:

Om jag lagrar en struct-variabel i en vector, och sedan vill söka i den. Hur ska jag göra funktionen för att plocka fram en hel plats med alla struct-variabeln om jag bara söker på en del av struct-variablern i vectorn?

Menar du att du till exempel har

struct Test { Test(int a_, int b_): a(a_), b(b_) {} int a; int b; };

och

vector<Test> v; v.push_back(Test(3, 2)); v.push_back(Test(4, 5)); v.push_back(Test(5, 8));

och sedan vill hitta hela det Test-objekt som till exempel har b = 5?

I så fall kan du till exempel använda find_if ur <algorithm>. Man kan till exempel skapa en funktion som returnerar true för ett Test-objekt som uppfyller kraven:

bool tstfkn(const Test& t) { if(t.b == 5) return true; else return false; }

och sedan anropa med

vector<Test>::iterator i = find_if(v.begin(), v.end(), tstfkn);

Smidigare är dock förmodligen att skapa någon typ av funktionsobjekt

struct FknObj { FknObj(int bVal_): bVal(bVal_) {} bool operator()(const Test& t) { return t.b == bVal; } int bVal; };

och sedan anropa med

vector<Test>::iterator i = find_if(v.begin(), v.end(), FknObj(5));

i är sedan alltså en iterator till det eftersökta objektet (eller v.end() om inget påträffades) och i->a samt i->b är objektets medlemsvariabler.

Permalänk
Medlem
Skrivet av vb:

Humm, är lite osäker på vad du menar men find_if kanske gör det du vill? http://www.cplusplus.com/reference/algorithm/find_if/

Funkar den så att om jag vill söka på exempelvis förnamnet bara, kan den hitta ändå, även fast jag skrivit in mer värden och variabler?

Ser nice ut Elgot :3
Tack för hjälpen båda :3

Permalänk
Medlem

\Desktop\lol\structlista\main.cpp||In function `void skriv(std::vector<person, std::allocator<person> >)':| \Desktop\lol\structlista\main.cpp|64|warning: comparison between signed and unsigned integer expressions| \Desktop\lol\structlista\main.cpp||In function `bool sok(std::vector<person, std::allocator<person> >&)':| \Desktop\lol\structlista\main.cpp|75|error: 'class std::vector<person, std::allocator<person> >' has no member named 'fornamn'| ||=== Build finished: 1 errors, 1 warnings ===| Fick de felmeddelandena på funktionen bool sok(vector<person>& a) { string sokning; cout << "Skriv förnamnet på personen du vill söka fram: "; cin >> sokning; if(a.fornamn == sokning){ return true; } else{ return false; } } med structen struct person{ string fornamn; string efternamn; int telefonnummer; string adress; int postnummer; string postort; string kontaktperson; }; och mainen int main() { vector<person> a; las(a); skriv(a); sok(a); return 0; } Vad ska jag göra? ;_;

Permalänk
Hedersmedlem

Felet beror i alla fall på att a är en vector<person> och inte en person. Du skulle dock kunna använda mitt exempel om du modifierar det till

struct FknObj { FknObj(string fnamn_): fnamn(fnamn_) {} bool operator()(const person& t) { return t.fornamn == fnamn; } string fnamn; };

I sok() kan du sedan, efter cin >> sokning, köra

vector<Test>::iterator i = find_if(a.begin(), a.end(), FknObj(sokning)); if(i != a.end()) return true; else return false;

Permalänk
Medlem

Eller något ännu trevligare om man slänger in en liten dos C++0x.

find_if(a.begin(), a.end(), [&sokning] (const person& t) { return t.fornamn == sokning; });

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk
Medlem

Om du ska göra många slagningar så kan du använda en std::map istället eftersom då hittar du ditt element på linjär tid. Men insättningar tar längre tid. Beror lite på vad du vill göra.

http://www.cplusplus.com/reference/stl/map/

Permalänk
Medlem
Skrivet av harre:

Om du ska göra många slagningar så kan du använda en std::map istället eftersom då hittar du ditt element på linjär tid. Men insättningar tar längre tid. Beror lite på vad du vill göra.

http://www.cplusplus.com/reference/stl/map/

std::map är implementerad som ett träd, och har logaritmisk söktid, inte linjär.

Permalänk
Medlem
Skrivet av badboll:

std::map är implementerad som ett träd, och har logaritmisk söktid, inte linjär.

Aha, där ser man... trodde den var implementerad som en hashmap

Finns det en sådan under stl? Har inte pillat med c++ på länge så jag är lite off nu

Permalänk
Medlem
Skrivet av harre:

Aha, där ser man... trodde den var implementerad som en hashmap

Finns det en sådan under stl? Har inte pillat med c++ på länge så jag är lite off nu

I STL ja, men STL är inte lika med C++ standardbibliotek (som dock är baserat på STL). De flesta stora kompilatorer idag skickar nog med en variant av unordered_map, som är föreslagen i C++0x (C++1x?).

Permalänk
Medlem
Skrivet av harre:

Aha, där ser man... trodde den var implementerad som en hashmap

Finns det en sådan under stl? Har inte pillat med c++ på länge så jag är lite off nu

hash_map skulle ha haft (amortized) konstant tid för lookups.

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."