STL, zwracanie iteratora w funkcji

0

Mam taką funkcję, chodzi o zasłonięcie bibliotecznej funkcji find_if() i wyszukiwanie w mapie elementu o danej wartości, a nie kluczu.

template <class T1, class T2>							
typename map<T1,T2>::iterator find_if(map<T1, T2> mapa, int value)
{
	map<T1, T2>::iterator it = mapa.begin();
	for(; it!= mapa.end(); it++)
	{
		cout << (*it).first << endl;
		if(it->second == value)
			break;
	}
	return it;
}

W main() wpisuje:

map<int, int>::iterator IT;
map<int, int> m;
m.insert(pair<int,int>(2,3));
m.insert(pair<int,int>(4,8));
IT = find_if(m, 8);

W debuggerze funkcja odnajduje dany element, ale już nie następuje przypisanie tego do iteratora IT. Co zrobić by przypisywało? Chciałbym nie wrzucać iteratora przez referencję do funkcji.

0

przeładowanie* ;X

0

nie bardzo rozumiem po co te kombinacje. algorytm find_if ze standardowej biblioteki jako trzeci parametr moze przyjsc obiekt funkcyjny(w tym wypadku predykat) ktory moze porownywac wartosci (nie klucze!) np:

//obiekt funkcyjny
template <typename T, typename K>
class CompareVal
{
	private:
		K val;
	
	public:
		explicit CompareVal(const K& v): val(v) {}
		
		bool operator() (const std::pair<T, K> temp) const
		{
			return temp.second == val;
		}
};

std::map<std::string, int> coll;

//dodajemy elementy

std::map<std::string, int>::iterator pos = std::find_if(coll.begin(), coll.end(), CompareVal<std::string, int>(32)); //szukamy elementu o wartosc 32

jezeli chodzi o twoj przyklad to wystarczy przekazac kontener przez referencje i bedzie dzialac. obecnie w funkcji tworzysz kopie kontenera i zwracasz iterator do elementu kontenera ktory juz nie istnieje(po opuszczeniu funkcji) ale... po co te podchody:)

0
tomekkkkk napisał(a)
template <class T1, class T2>							
typename map<T1,T2>::iterator find_if(map<T1, T2> mapa, int value)  // A
{
	map<T1, T2>::iterator it = mapa.begin();    //B
	for(; it!= mapa.end(); it++)
	{
		cout << (*it).first << endl;
		if(it->second == value)
			break;
	}
	return it;   //C
}

w (A) przekazujesz mape przez wartosc
w (B) tworzysz do NIEJ iterator
w (C) go zwracasz
ale przeciez, na wyjsciu z funkcji, kopia lokalna mapy przestaje istniec i tym samym iterator sie degeneruje..

proponuje zaczac naprawianie tego kodu, do przekazania mapy przez np. referencje

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