c++, std::count, std::string och std::vector. @linux

Permalänk
Medlem

c++, std::count, std::string och std::vector. @linux

Hej!,

jag har något fel i denna kod som jag inte förstår:

int countp(vector<person> &v) { string temp_search; cout << "Skriv in de namn eller del av\n" << "namn du söker antalet på." << endl; cin >> temp_search; string temp_name; int temp, p_count; for(int i = 0; i<v.size(); i++) { temp_name=v[i].name; temp = count(temp_name.begin(), temp_name.end(), temp_search); p_count=p_count+temp; } cout << "Hitta med din sökning är: " << p_count << endl; return 0; }

felmeddelande:

In file included from /usr/include/c++/4.6/algorithm:63:0, from using.h:7, from personSearch.cpp:1: /usr/include/c++/4.6/bits/stl_algo.h: In function ‘typename std::iterator_traits<_InputIterator>::difference_type std::count(_IIter, _IIter, const _Tp&) [with _IIter = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, _Tp = std::basic_string<char>, typename std::iterator_traits<_InputIterator>::difference_type = long int]’: personSearch.cpp:15:63: instantiated from here /usr/include/c++/4.6/bits/stl_algo.h:4591:2: error: no match for ‘operator==’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = char*, _Container = std::basic_string<char>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = char&]() == __value’ /usr/include/c++/4.6/bits/stl_algo.h:4591:2: note: candidates are: /usr/include/c++/4.6/bits/stl_pair.h:201:5: note: template<class _T1, class _T2> bool std::operator==(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&) /usr/include/c++/4.6/bits/stl_iterator.h:285:5: note: template<class _Iterator> bool std::operator==(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&) /usr/include/c++/4.6/bits/stl_iterator.h:335:5: note: template<class _IteratorL, class _IteratorR> bool std::operator==(const std::reverse_iterator<_IteratorL>&, const std::reverse_iterator<_IteratorR>&) /usr/include/c++/4.6/bits/postypes.h:218:5: note: template<class _StateT> bool std::operator==(const std::fpos<_StateT>&, const std::fpos<_StateT>&) /usr/include/c++/4.6/bits/allocator.h:122:5: note: template<class _T1, class _T2> bool std::operator==(const std::allocator<_T1>&, const std::allocator<_T2>&) /usr/include/c++/4.6/bits/allocator.h:127:5: note: template<class _Tp> bool std::operator==(const std::allocator<_Tp1>&, const std::allocator<_Tp1>&) /usr/include/c++/4.6/bits/basic_string.h:2427:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator==(const std::basic_string<_CharT, _Traits, _Alloc>&, const std::basic_string<_CharT, _Traits, _Alloc>&) /usr/include/c++/4.6/bits/basic_string.h:2434:5: note: template<class _CharT> typename __gnu_cxx::__enable_if<std::__is_char<_Tp>::__value, bool>::__type std::operator==(const std::basic_string<_CharT>&, const std::basic_string<_CharT>&) /usr/include/c++/4.6/bits/basic_string.h:2448:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator==(const _CharT*, const std::basic_string<_CharT, _Traits, _Alloc>&) /usr/include/c++/4.6/bits/basic_string.h:2460:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator==(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*) /usr/include/c++/4.6/bits/streambuf_iterator.h:194:5: note: template<class _CharT, class _Traits> bool std::operator==(const std::istreambuf_iterator<_CharT, _Traits>&, const std::istreambuf_iterator<_CharT, _Traits>&) /usr/include/c++/4.6/bits/stl_vector.h:1273:5: note: template<class _Tp, class _Alloc> bool std::operator==(const std::vector<_Tp, _Alloc>&, const std::vector<_Tp, _Alloc>&) /usr/include/c++/4.6/ext/new_allocator.h:123:5: note: template<class _Tp> bool __gnu_cxx::operator==(const __gnu_cxx::new_allocator<_Tp>&, const __gnu_cxx::new_allocator<_Tp>&) /usr/include/c++/4.6/bits/stl_iterator.h:805:5: note: template<class _Iterator, class _Container> bool __gnu_cxx::operator==(const __gnu_cxx::__normal_iterator<_Iterator, _Container>&, const __gnu_cxx::__normal_iterator<_Iterator, _Container>&) /usr/include/c++/4.6/bits/stl_iterator.h:799:5: note: template<class _IteratorL, class _IteratorR, class _Container> bool __gnu_cxx::operator==(const __gnu_cxx::__normal_iterator<_IteratorL, _Container>&, const __gnu_cxx::__normal_iterator<_IteratorR, _Container>&) make: *** [comp] Error 1

när jag kommentera bort denna rad så får jag inge error:

temp = count(temp_name.begin(), temp_name.end(), temp_search);

någon som har en idé varför de är så?

Inlägg sammanfogade.
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
Inaktiv

Du borde inte köra string, är inte säker på att du kan "==" såna objekt.

Prova en char[] istället

Permalänk
Medlem

Jag kikade lite fort på: http://www.cplusplus.com/reference/algorithm/count/

Din temp_name är ingen vector utan det är en sträng.

Edit: glöm allt jag sa, för att jag glömde att string också har begin och end

Visa signatur

Lian Li 6070B / Asus P8P67 B3 / Intel Core i5 2500K @ 4.5GHz
Corsair Vengance 8GB 1600MHz / Asus GTX780 / Corsair TX650V2

Permalänk

temp = count(temp_name.begin(), temp_name.end(), temp_search.c_str());

Kanske kan fungera?

Visa signatur

Citera, tack!
Har du läst tråden om strandhögtalare och andra musiklådor?

Permalänk
Hedersmedlem
Skrivet av blomqvist:

temp = count(temp_name.begin(), temp_name.end(), temp_search.c_str());

Kanske kan fungera?

Det verkar lite onödigt dock. Tanken med count är att man själv skall slippa iterera; om man menar sådär vore det enklare att bara skriva

if(temp_name == temp_search) p_count++;

eller liknande.
count kräver dock att man skickar med ett objekt att jämföra med, så man måste skapa ett nytt person-objekt från namnet (och dessutom måste det räknas som identiskt med andra som har samma namn), vilket är jobbigt. Som tur är finns även count_if där man kan specificera vad det är man vill jämföra. Om man har stöd för c++11 borde man kunna skriva till exempel:

p_count = count_if(begin(v), end(v), [&temp_search](const person& p){return p.name == temp_search;});

Edit: Notera hur jag undvek att svara på frågan. Sannolikt är felet att en string kan ses som en samling char, men inte en samling string.

Edit2: Och för att kunna söka efter delsträngar kan man med fördel använda string.find():

p_count = count_if(begin(v), end(v), [&temp_search](const person& p){return p.name.find(temp_search) != string::npos;});

Permalänk
Medlem
Skrivet av Mejan:

när jag kommentera bort denna rad så får jag inge error:

temp = count(temp_name.begin(), temp_name.end(), temp_search);

någon som har en idé varför de är så?

Elementen i "temp_name" som "count" itererar över är av typen "char".
Värdet "temp_search" som du försöker jämföra elementen med är av typen "string".

Det finns ingen inbyggd jämförelse-operator i STL mellan dessa två typer. Med andra ord så failar även följande kod:

char left = 'x'; string right = "x"; if (left == right) { // Booom! <...> }

Edit: Ah, Elgot nämnde redan det i en edit.

Skrivet av Killbom:

Du borde inte köra string, är inte säker på att du kan "==" såna objekt.

Prova en char[] istället

Snarare tvärtom. Du kan gott använda dig av "==" mellan två string-objekt men inte mellan två char-pekare/arrayer (eller nåja, det sistnämnda gör bara inte det man först tror att det gör).

Visa signatur

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

Permalänk
Medlem

tack för alla tips jag har sumerat era råd och tänkt om kom fram till att den här var min lössning:

#include "using.h" #include "person.h" #include "funktions.h" int findperson(vector<person> &v) { string temp_name; string temp_search; cin >> temp_search; temp_search=lower(temp_search); int j=0; for(int i=0; i < v.size(); i++) { temp_name=v[i].name; temp_name=lower(temp_name); if(temp_name.find(temp_search) != string::npos) { j++; } } return j; }

lower är bara en funktion som gör om alla stora bokstäver inklusive åäö till små

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