Vorrei passare un singolo lvalue a una funzione che si aspetta una coppia di iteratori e agire come se avessi passato una coppia di iteratori a un intervallo contenente solo questo valore.Iterating over a lvalue
Il mio approccio è il seguente:
#include <iostream>
#include <vector>
template<typename Iter>
void iterate_over(Iter begin, Iter end){
for(auto i = begin; i != end; ++i){
std::cout << *i << std::endl;
}
}
int main(){
std::vector<int> a{1,2,3,4};
iterate_over(a.cbegin(), a.cend());
int b = 5;
iterate_over(&b, std::next(&b));
}
Questo sembra funzionare correttamente in g ++ 5.2, ma mi chiedo se questo è in realtà definito il comportamento e se ci sono eventuali problemi?
Le coppie di Iterator descrivono ** intervalli **. I contenitori sono un modo per creare intervalli, ma non sono l'unico modo. Non è necessario che gli iteratori puntino agli elementi di un contenitore. –
Grazie, modificato la domanda per chiarezza. – cloakedlearning
Ci sono una moltitudine di domande/risposte relative/duplicate a questo, tra cui: https://stackoverflow.com/questions/14505851/è-il-uno-pasta-il-punto-intervallo-a-non-array -tipo-valido-concetto-in-c, https://stackoverflow.com/questions/2405555/string-s-s1-legal-ub, https://stackoverflow.com/questions/21411102/treating-a -singolo-oggetto-come-un-array-con-un-elemento-prendendo-uno-passato-fine-poi, ecc. – WhozCraig