Problem z SET

0

Mam taki zbiór:

typedef pair<int, int> para;

typedef set<para> zestaw;    

zestaw zbior; //tworzenie elementu

zbior.insert(para(0,NULL));
zbior.insert(para(1,NULL));
zbior.insert(para(2,1));
zbior.insert(para(3,8));
zbior.insert(para(4,NULL));
zbior.insert(para(5,12));

Zastanawiam się w jaki sposób mogę najefektywniej znaleźć pierwszy i ostatni element, który na drugim miejscu w parze posiada wartość NULL.

Eksperymentuję z funkcją lower_bound. Jednak tutaj muszę podać wartość całej pary a to mi dokładnie psuje plany.

Liczę na pomoc.

0

Hmmm, ja bym to zrobił na piechotę:

typedef pair<int, int> para;
typedef set<para> zestaw; 
  

zestaw zbior; //tworzenie elementu

zbior.insert(para(0,NULL));
zbior.insert(para(1,NULL));
zbior.insert(para(2,1));
zbior.insert(para(3,8));
zbior.insert(para(4,NULL));
zbior.insert(para(5,12));


zestaw::iterator it = zbior.begin();

while(it != zbior.end() ) {

    if( it->second == 0) {
         //akcja gdy znajdziesz 0 (NULL)
    }

    ++it;

}

P.S. NULL jest makrodefinicją, której nie ma w standardzie języka, dlatego nie zdziw się gdy kiedyś kompilator wyrzuci Ci że nie wie co to jest "NULL".

0

STL way:

#include <iostream>
#include <algorithm>
#include <set>
using namespace std;

typedef pair<int, int> para;

typedef set<para> zestaw;    

struct SecondValue
{
	int value;

	SecondValue(int v) : value(v) {}
	bool operator()(const para& p)
	{
		if ( p.second == value )
			return true;
		else
			return false;
	}
};

int main()
{
	zestaw zbior; //tworzenie elementu

	zbior.insert(para(0,0));
	zbior.insert(para(1,0));
	zbior.insert(para(2,1));
	zbior.insert(para(3,8));
	zbior.insert(para(4,0));
	zbior.insert(para(5,12));

	zestaw::iterator it;
	it = find_if( zbior.begin(), zbior.end(), SecondValue(0) );
	// sprawdzic czy it == end()
	cout << it->first << endl;

	zestaw::reverse_iterator rit;
	rit = find_if( zbior.rbegin(), zbior.rend(), SecondValue(0) );
	// tu tez sprawdzic czy doszlo do konca (znaczy do poczatku :-)
	cout << rit->first << endl;
}

I widać dokładnie o co chodzi.
Z NULLem to faktycznie bez przesady w C++ :]

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