wstawianie stringa do posortowanej tablicy (vector)

0

Mam takie zadanie:
Napisz funkcje Wstaw która wstawia napis do posortowanej tablicy w odpowiednie miejsce.
Nagłówek ma postać:

bool Wstaw(const string & slowo, vector<string> & wykaz);
//słowo zawiera napis do wstawienia
// wykaz jest tablica napisów posortowanych alfabetycznie

Jeśli napis znajduje sie w tablicy to funkcja ma zwracac false
a jeśli go nie ma ma zwracać true i wstawiać go w odpowiednie miejsce.

Wymyśliłem coś takiego:

bool Wstaw(const string & slowo, vector<string> & wykaz)
{//1
     bool istnieje;
     int pozycja;
     istnieje = false;
     for(int i=0; i<wykaz.size();i++)
     {//2
             if(wykaz[i]==slowo)
             {//3
             istnieje = true;
             }//3
     if(wykaz[i]>slowo)
     {//4
     pozycja=i;                  
     }//4
     }//2
                                
     if(istnieje == true)
     {//5
                 return false;
                 }else{//5
                       wykaz.insert(pozycja,slowo);
                       return true;
                       }//5
     
     }//1

Ale jest żle.

0
bool Wstaw(const string & slowo, vector<string> & wykaz) {
vector<string> iter;
for( iter = wykaz.begin(); iter != wykaz.end() && slowo > *iter; ++i );
--iter;
wykaz.insert( iter, slowo );
}
0

Rozumiem ze to mam wstawic zamiast:

wykaz.insert(pozycja,slowo);

0

Nie. na początku możesz jeszcze dać find( wykaz.begin(), wykaz.end(), slowo ); i poszuka ci danego elementu.

Poczytaj http://cplusplus.com/reference/stl/vector/ w szczególności insert()

0

iter powinno być raczej typu vector<string>::iterator.

0
#include<iostream>
#include<vector>

using namespace std;


bool Wstaw(const string & slowo, vector<string> & wykaz) {
vector<string>::iterator iter;

*> if( find( wykaz.begin(), wykaz.end(), slowo ) < 0 ) //czy znajduje sie w tablicy
{//jesli tak
for( iter = wykaz.begin(); iter != wykaz.end() && slowo > *iter; ++iter );//szukamy miejsca na wstawienie
--iter;//cofamy o jedno
wykaz.insert( iter, slowo );//wstawiamy
return true;
}else{//jesli nie
return false;      
}

}
     
     
int main()
{
vector<string> tablica;
tablica.push_back("a");
tablica.push_back("b");
tablica.push_back("d");
Wstaw("c",tablica);

for(int i = 0; i < 4; i++) {
cout << tablica[i] << endl;
}

cin.get();
cin.get();
}

Tak wyglada caly moj program.
Ale w miejscu " *>" wywala blad:

10 D:\Pen!PO2\wstaw2.cpp no match for 'operator<' in 'std::find [with _InputIterator = __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocatorstd::string > >, _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]((+wykaz)->std::vector<_Tp, _Alloc>::begin with _Tp = std::string, _Alloc = std::allocatorstd::string, (+wykaz)->std::vector<_Tp, _Alloc>::end with _Tp = std::string, _Alloc = std::allocatorstd::string, ((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)(+slowo))) < 0'

0
bool wstaw(const string& slowo, vector<string>& wykaz)
{
	vector<string>::iterator iter;
	vector<string>::iterator begin = wykaz.begin(), end = wykaz.end();
	if(find(begin, end, slowo) == end) //czy znajduje sie w tablicy
	{//jesli nie
		for(iter = begin; iter != end && slowo > *iter; ++iter)//szukamy miejsca na wstawienie
		{ /* nic */ }
		wykaz.insert(iter, slowo);//wstawiamy
		return true;
	}
	else
	{//jesli tak
		return false;      
	}
}
0
bool Wstaw(const string & slowo, vector<string> & wykaz) {
    if(find(wykaz.begin(), wykaz.end(), slowo) == wykaz.end()) {
        wykaz.insert(lower_bound(wykaz.begin(), wykaz.end(), slowo), slowo);
        return true;
    }
    return false;
}
0
vector<string>::iterator wstaw(const string& slowo, vector<string>& wykaz)
{
      return wykaz.insert( std::lower_bound(wykaz.begin(),wykaz.end(),slowo), slowo); 
}

ale czy nie lepiej stosować std::set<string>?

0

@MarekR22 - ta funkcja według zadania ma zwracać boola, twoja zwraca iterator.
Pewnie set stringów byłby lepszy, tylko może potrzebny jest swobodny dostęp do elementów, a wtedy set wymięka.
@temat: No to jeszcze jedna wersja (przyznam, że zasugerowałem się winerfreshem, zamiast zrobić porządnie ;)):

bool Wstaw(const string& slowo, vector<string>& wykaz)
{
	vector<string>::const_iterator begin = wykaz.begin(), end = wykaz.end();
	if(binary_search(begin, end, slowo) == false)
	{
		wykaz.insert(lower_bound(begin, end, slowo), slowo);
		return true;
	}
	return false;
}

Spełnia warunki zadania i ma dobrą, logarytmiczną złożoność.

0

Nie trzeba wyszukiwać dwukrotnie, wystarczy raz:

bool Wstaw(const string& slowo, vector<string>& wykaz)
{
   vector<string>::iterator it = lower_bound(wykaz.begin(), wykaz.end(), slowo);
   if (it != wykaz.end() && *it == slowo) return false;
   wykaz.insert(it, slowo);
   return true;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1