mi viene data due set (std :: set da <set>
) di cui mi piacerebbe conoscere la dimensione dell'intersezione . Potrei usare std :: set_intersection da <algorithm>
, ma devo fornire un iteratore di output per copiare l'intersezione in qualche altro contenitore.come calcolare le dimensioni di un incrocio di due insiemi STL in C++
Un modo semplice sarebbe
set<int> s1{1,2,3,4,5};
set<int> s2{4,5,6,7,8,9,0,1};
vector<int> v;
set_intersection(
s1.begin(), s1.end(), s2.begin(), s2.end(),
inserter(v, v.begin()));
dopodiché V.SIZE() fornisce la dimensione dell'intersezione. Tuttavia, l'intersezione dovrà essere memorizzata, anche se non facciamo nulla con esso.
Per evitare questo, ho cercato di implementare una classe di uscita iteratore manichino, che conta solo, ma non assegna:
template<typename T>
class CountingOutputIterator {
private:
int* counter_;
T dummy_;
public:
explicit CountingOutputIterator(int* counter) :counter_(counter) {}
T& operator*() {return dummy_;}
CountingOutputIterator& operator++() { // ++t
(*counter_)++;
return *this;
}
CountingOutputIterator operator++(int) { // t++
CountingOutputIterator ret(*this);
(*counter_)++;
return ret;
}
bool operator==(const CountingOutputIterator& c) {
return counter_ == c.counter_; // same pointer
}
bool operator!=(const CountingOutputIterator& c) {
return !operator==(c);
}
};
usando che potremmo fare
set<int> s1{1,2,3,4,5};
set<int> s2{4,5,6,7,8,9,0,1};
int counter = 0;
CountingOutputIterator<int> counter_it(&counter);
set_intersection(
s1.begin(), s1.end(), s2.begin(), s2.end(), counter_it);
dopo di che contatore tiene la dimensione dell'intersezione.
Questo è molto più codice tuttavia. Le mie domande sono:
1) Esiste un metodo standard (libreria) o un trucco standard per ottenere la dimensione dell'intersezione senza memorizzare l'intera intersezione? 2) Indipendentemente dal fatto che ci sia o meno, l'approccio con il fittizio iteratore personalizzato è buono?
Sembra troppo complicato per l'identificazione del numero di elementi comuni. Perché non usare solo un loop? – Aldehir
Molto strano, qual è il punto di sapere la dimensione quando non utilizzerai mai l'incrocio? Stai pensando a questo chiaramente? [Leggi questo] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –
Piuttosto che un iteratore personalizzato, sarebbe più semplice creare un "contenitore" personalizzato che abbia un membro 'insert()' che conta e usa 'insert_iterator' con quello. –