C++ STL <set>

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0
Kopiuj
 
#include <iostream>
#include <set>
using namespace std;
int main()
{
	multiset<int> mm;
	int tab[]={5,7,6,3,4,5,6,4,3,54,6,78,5,45,3,5,45,6,4,3};
	for (int i=0;i<20;i++)
	{
		mm.insert(tab[i]);
	}	
	multiset<int>::iterator ii=mm.begin()+3;         //nie dziala
	//cout<<*(mm.begin()+3);                          //to tez
	//ii+=3;                                                    //i to
	for (;ii!=mm.end();ii++)
	{
		cout<<*ii<<" ";
	}
}

Witam
Mógłby mi ktoś powiedzieć dlaczego nie da się w powyższy sposób ustawić iterator na 3 elemencie ?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Bo nie jest to iterator Random Access
http://www.cplusplus.com/reference/iterator/

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2518
0

możesz zrobić np. lower_bound na secie, tu masz przykład:
http://www.cplusplus.com/reference/set/set/lower_bound/

swoją drogą wrzucenie elementów do vectora i wykonaniu na nich później sort jest mniej kosztowne niż wrzucaniu ich do set'a. Najszybszą opcją wrzucania do seta jest skorzystanie z drugiego przeładowania tutaj:
http://www.cplusplus.com/reference/set/set/insert/

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Dostęp do konkretnego elementu potrzebny mi jest ponieważ muszę wyliczyć mediany ciągów. Ponieważ nie mogę tego w ten sposób zrobić najlepiej będzie chyba użyć vectorów. Dzięki wam za pomoc

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Na upartego da się to zrobić również na tym multiset:

Kopiuj
   multiset<int> mm;
   int tab[]={5,7,6,3,4,5,6,4,3,54,6,78,5,45,3,5,45,6,4,3};
   for(int i=0;i<sizeof(tab)/sizeof(*tab);++i) mm.insert(tab[i]);
   multiset<int>::iterator i=mm.begin(),k=mm.end();
   while((--k!=i)&&(k!=++i)) {}
   cout<<*i<<endl;

Ale i tak vector<> z częściowym sortowaniem jest lepszy.

robcio
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Opole
  • Postów: 533
0

dodawanie do iteratorów w przypadku pojemników nie sekwencyjnych(typu listy) nie ma sensu bo nie można się tak po prostu odnieść do konkretnego elementu. Tylko trzeba od początku przeglądać listę aż dojdzie się do właściwego elementu. Więc dodawanie do iteratora na pojemnik typu lista jest po prostu nielogiczne(dla wektora ma to sens bo jest sekwencyjny).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.