C++ STL <set>

0
 
#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 ?

0

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

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/

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

0

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

   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.

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).

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