Non è possibile digitare direttamente uno std :: vector in uno std :: string o viceversa. Ma usando gli iteratori che i contenitori STL forniscono, ti permette di iterare sia un vettore che una stringa allo stesso modo. E se la tua funzione richiede l'accesso casuale al contenitore in questione, allora funzionerebbe.
std::vector<char> str1 {'a', 'b', 'c'};
std::string str2 = "abc";
template<typename Iterator>
void iterator_function(Iterator begin, Iterator end)
{
for(Iterator it = begin; it != end; ++it)
{
std::cout << *it << std::endl;
}
}
iterator_function(str1.begin(), str1.end());
iterator_function(str2.begin(), str2.end());
Entrambe le ultime due chiamate di funzione stamperebbero la stessa cosa.
Ora, se si desidera scrivere una versione generica che analizza solo i caratteri memorizzati solo in una stringa o in un vettore, è possibile scrivere qualcosa che ha iterato l'array interno.
void array_function(const char * array, unsigned length)
{
for(unsigned i = 0; i < length; ++i)
{
std::cout << array[i] << std::endl;
}
}
Entrambe le funzioni farebbero la stessa cosa nei seguenti scenari.
std::vector<char> str1 {'a', 'b', 'c'};
std::string str2 = "abc";
iterator_function(str1.begin(), str1.end());
iterator_function(str2.begin(), str2.end());
array_function(str1.data(), str1.size());
array_function(str2.data(), str2.size());
Ci sono sempre diversi modi per risolvere un problema. A seconda di ciò che hai a disposizione, qualsiasi numero di soluzioni potrebbe funzionare. Provare entrambi e vedere quale funziona meglio per la propria applicazione.Se non si conosce il tipo di iteratore, è utile l'iterazione dell'array di tipo char. Se sai che avrai sempre il tipo di modello da passare, il metodo di iterazione del modello potrebbe essere più utile.
Questo è ciò per cui sono stati creati gli iteratori. –
Hai mai pensato di rendere la funzione un modello? – mamahuhu
Affidarsi al comportamento del sottotetto di una classe anziché all'interfaccia pubblicata può essere pericoloso. Qual è la necessità di questo? – Greg