2014-07-22 36 views
8

W poniższym kodzie rozmiar argumentu function (foo) (std::vector) może być dowolny, aby funkcja była ogólna. Jednak czasami pojemnik wielkości jest znany, więc można użyć std :: array. Problem polega na przekonwertowaniu modelu std::array na std::vector. Jaki jest najlepszy sposób na rozwiązanie tego problemu? Czy w takim przypadku lepiej jest zawsze używać std::vector?Konwersja std :: array na std :: vector

#include <iostream> 
#include <array> 
#include <vector> 

using namespace std; 

// generic function: size of the container can be anything 
void foo (vector<int>& vec) 
{ 
    // do something 
} 

int main() 
{ 
    array<int,3> arr; // size is known. why use std::vector? 
    foo (arr); // cannot convert std::array to std::vector 

    return 0; 
} 
+1

Zakładam, że 'foo' modyfikuje wektor, ponieważ przyjmuje on zmienną referencję, czy to prawda? To będzie bardzo istotne dla odpowiedzi. –

+0

Na razie będziemy musieli to obejść, ale w przyszłości napiszemy coś w stylu 'void foo (RangeOf &);' i zajmie to dowolny zakres 'int's. –

+1

Ten problem powoduje, że standardowa biblioteka zawsze pobiera iteratory 'begin' i' end'. W ten sposób nie obchodzi się, z którego kontenera korzystasz. –

Odpowiedz

15

Zważywszy, że można przejść w array, foo nie wydaje się, aby zmienić rozmiar pojemnika pobiera przekazany w (jednak wydaje się, aby zmodyfikować elementy od vec przepuszcza const). Dlatego nie musi wiedzieć nic o podstawowym kontenerze, poza tym, jak uzyskać dostęp do elementów.

Następnie można przekazać parę iteratorów (i ustawić typ iteratora jako argument szablonu), tak jak robi to wiele algorytmów STL.

+0

Ponadto, jeśli chcesz uniknąć tworzenia szablonu, parametry mogą być wartość 'int * first' i' size_t count' –

+3

@MooingDuck: 'int * begin, int * end' to będzie C++, a nie 'int * first, size_t count'. – Nawaz

0

Funkcja przyjmuje wektor według referencji. Więc nie ma sensu przekazywać obiektu typu std :: array do funkcji. Może mieć sens, jeśli parametr funkcji zostanie zdefiniowany jako odniesienie do wektora.