2016-05-26 5 views
-2

Ich habe eine Matrix in einem Vektor in Reihe Großordnung sottred. Zum Beispiel:Wie kopiert man einen Teil eines Vektors in einen anderen in C++

1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 

Ich habe eine Funktion

void transformatrix(vector<uint32> *vector_a) 

die einige Modifikationen an einer Matrix durchführt. Ich muss einen Teil eines Vektors an diese Funktion übergeben. Zum Beispiel muss ich

2 6 10 14 

passieren, was ich denke über eine Kopie eines Vektors zu erstellen ist, gibt sie an eine Funktion:

vector<int> v2(v.begin() + x, v.begin() + x + y); 

Aber es wäre besser, einen anderen Vektor zu erstellen Das ist nur ein Zeiger auf den Originalvektor, da ich immer sequentiell auf Elemente zugreife.

Gibt es eine Möglichkeit, einen anderen Vektor zu erstellen, ohne Daten zu verarbeiten?

+1

_ "Gibt es eine Möglichkeit, einen anderen Vektor ohne Datenverarbeitung zu erstellen?" _ ** Nein. ** –

+0

Sie könnten einen Vektor von Iteratoren aber seit Ihren Daten haben ist nur 'int's Ich würde sie kopieren – NathanOliver

+2

Ein Teil eines Vektors, akaEin * Bereich *, ist * ein Paar Iteratoren *. –

Antwort

2

So etwas helfen:

template <typename T> void your_function(T it_beg,T it_end){ 
    //do what ever you want 
} 

int main(){ 
    std::vector<int> v{1,1,1,1,1,1,1,1,1,1}; 
    your_function(v.begin()+x,v.begin()+x+y); 
} 

Use Case:

//Multiply all element by 2 
template <typename T> void your_function(T it_beg,T it_end){ 
    for(auto it=it_beg;it!=it_end;++it){ 
     *it*=2; 
    } 
} 

EDIT:

Nach der OP dieses d vorgesehen elcartion:

void transformatrix(vector<uint32> *vector_a) 

Der einzige Weg, es ohne den Vektor zu senden, ohne das Kopieren zu lösen, ist wie folgt:

Hinweis: Dies ist eine schreckliche Idee. Tun Sie NICHT verwenden Sie es. Es ist nicht threadsicher. Es ist schlecht und jeder, der deinen Code überprüft, wird dich mehr hassen, als du dir vorstellen kannst.

int main(){ 
    std::vector<int> v{1,1,1,1,1,1,1,1,1,1}; 
    v.emplace_back(x); 
    v.emplace_back(y); 
    transformatrix(&v); 
    v.pop_back(); 
    v.pop_back(); 
} 

Innen transformatrix:

void transformatrix(vector<uint32> *vector_a){ 
    auto beg_index=vector_a[vector_a.size()-2]; 
    auto end_index=vector_a[vector_a.size()-2]+vector_a[vector_a.size()-1]; 
    //Your original code here with respect that you indexes now from beg_index->end_index 
} 

Auch dies ist gebrochen Lösung, aber es ist der einzige Weg, um es in Bezug auf Ihre Zwänge zu tun. Beachten Sie, dass dies für die x64-Plattform nicht vollständig funktioniert, da der Datentyp 32 ist und ich ihn auch für die Indizierung verwende. Sie können also nur von der 32-Bit-Indizierung auf der 64-Plattform profitieren

+0

suchen Aber meine Funktion akzeptieren Vektor. Nicht Iterator – user1209304

+0

Können Sie es ändern? –

+1

Bitte bearbeiten Sie Ihre Frage mit dieser Information: Was ist die Funktion Verzögerung? ... können Sie sie ändern? ... können wir nichts wissen, was Sie nicht zur Verfügung gestellt haben :) –

1

Sie können Iteratoren mit diesen Positionen haben (die möglicherweise ungültig werden).

vector<int>::const_iterator start = v.begin() + x; 
vector<int>::const_iterator till = v.begin() + x + y; 

Es ist nicht eine andere vector schafft aber die Positionen (und die Ist-Werte) können an jedem vector Betrieb ungültig.