Szablon klasy i indeksowanie

0

Mam zrobiony kontener, który przetrzymuje mi elementy, jednak mam pewien problem. Zrobiony jest tak, że powtarzające się elementy nie są indeksowane (a chcę żeby i takie były w kontenerze, normalnie indeksowane) i nie mam pojęcia jak to zmienić. Wrzucam dwie metody, które za to odpowiadają.

 bool Kontener<TYP>::dodajElement(const TYP &ob){
	if (indexOf(ob) == -1){ //Sprawdzanie czy obiekt znajduje sie w kontenerze
			
				Wezel<TYP> *nowy_wezel, *pop_wezel;
				nowy_wezel = new Wezel<TYP>();

				nowy_wezel->poprzedni_wezel = NULL;
				nowy_wezel->nastepny_wezel = NULL;
				nowy_wezel->ob = ob;

				if (liczba_elementow == 0){
					poczatek = nowy_wezel;
				}
				else {
					Wezel<TYP> *tmp;
					tmp = zwrocWskaznikWezla(liczba_elementow - 1);
					tmp->nastepny_wezel = nowy_wezel;
					if (liczba_elementow > 1){
						pop_wezel = zwrocWskaznikWezla(liczba_elementow - 2);
						tmp->poprzedni_wezel = pop_wezel;
					}
				}

				liczba_elementow++;
				return true; //Dodano obiekt
			}
	else
		return false;

}

template <class TYP>
int Kontener<TYP>::indexOf(const TYP &k){
	int indeks = -1;
	for (int i = 0; i < liczba_elementow; i++)
		if ((*this)[i] == k)
		{
			indeks = i;
			break;
		}
	return indeks;
}

Proszę o pomoc.

1
if (indexOf(ob) == -1) {    // jesli nie ma elementu o takiej wartosci
    ....                    // dodaj element
}
else                        // jesli jest
    return false;           // nie dodaj

Bardzo jasno powiedziałeś kompilatorowi, żeby nie dodał powtarzających się wartości.

Tylko zauważ, że jak to poprawisz to funkcja indexOf() będzie miała inne znaczenie, będzie zwracać pierwszy pasujący indeks.

1

Kontener dobrze działa w wyszukaniu, także dla Twojego przypadku.
Po prostu przy wyszukaniu zwraca indeks pierwszego elementu (i nic innego nie może zwrócić).
Możesz natomiast dodać nakładkę która zwróci cały zakres pasujących rekordów, coś na kształt:

template

// w przypadku nie znalezienia zwraca parę last, last
<class T>
  std::pair<int, int> find_range(int first, int last, const T& val)
{
  int i = first;
  int first_ok, last_ok;
  while (i!=last) {
    if (this[i]==val) 
       break;
    ++i;
  }

  if (i == last)
    return std::make_pair(last, last);

  first_ok = last_ok = i;

  while (i!=last) {
    if (this[i]==val) 
       ++last_ok;
    else
       break;
    ++i;
  }
  
  return std::make_pair(first_ok, last_ok);
}

// użycie
Kontener<int> kont;
...
std::pair<int,int> rng = kont.find_range(0, kont.size(), 123);

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