2016-07-20 29 views
2

Ich möchte eine Vorlage für ein Argument einer Funktion machen.C++ Vorlage für Std :: Vektor mit benutzerdefinierten Speicherzuordner

Das Argument ist ein std::vector<type> mit einem Zuordner.

Standardmäßig wird der Standardspeicherzuordner verwendet, es kann jedoch auch ein benutzerdefinierter Zuordner verwendet werden.

Der folgende Code funktioniert nicht. Wie behebe ich das?

template <typename T, typename T2=std::allocator<T>> 
void pad_zero(std::vector<T,T2> vec, uint32_t n){ 
    uint32_t i; 
    for (i = 0; i < n; i++){ 
     vec.push_back(0); 
    } 
} 

Danke.

+0

http://coliru.stacked-crooked.com/a/3ad139c309b53f99; '= std :: allocator ' ist nicht notwendig. – LogicStuff

+1

Funktioniert nicht wie? Übrigens ändert sich nur die lokale Variable 'vec'. – KIIV

+0

beide Intel C Compiler und GCC beschwert sich mit einem <> innerhalb der Vorlage <...>. Das Problem scheint, dass das zweite Template-Argument vom 1. Template-Argument abhängt. – rxu

Antwort

4

Sie müssen keinen Standardwert für den Zuordner angeben. Aber das Problem ist, dass Sie eine lokale Variable auffüllen - Sie akzeptieren vec von Wert!

Nehmen Sie es als Referenz, und löschen Sie den unnötigen Standard. Darüber hinaus gibt es eine Überlastung von insert(), das tut genau das, was Sie wollen, keine manuellen Schleifen erforderlich (was nicht nur ausführlich ist aber ineffizient aufgrund der unsicheren Anzahl von Umschichtungen):

template <typename T, typename A> 
void pad_zero(std::vector<T,A>& vec, uint32_t n) { 
//       ^^^ 
    vec.insert(vec.end(), n, T{0}); 
} 
2

Sie brauchen nicht das bieten Allokator, Template-Argument-Abzug macht das für Sie.

Hinweis zusätzlich, dass Sie Ihren Vektor von Wert sind vorbei, so innerhalb pad_zero Sie eine Kopie des Vektors erhalten, während das Original unverändert bleibt, was wahrscheinlich ist, nicht das, was Sie suchen

siehe Code unten

http://coliru.stacked-crooked.com/a/5457167a4aeb36db

#include <iostream> 
#include <vector> 

template <typename T, typename A> 
void pad_zero(std::vector<T,A>& vec, uint32_t n) 
{ 
    uint32_t i; 
    for (i = 0; i < n; i++) 
    { 
     vec.push_back(0); 
    } 
} 

int main() 
{ 
    std::vector<int> a = { 1, 2, 3 }; 
    pad_zero(a, 10); 

    for (int i : a) 
     std::cout << i << '\n'; 
} 

Ausgang:

1 
2 
3 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0