2016-12-12 5 views
3

Wie kann ich mich über den Schwanz eines Vektors erhalten:Erhalten Schwanz eines Vektors?

std::vector<int> Example {1,2,3,4,5}; 

//head = [1] 
//tail = [2,3,4,5] 

Python:

head = Array[0] 
tail = Array[1:] 

Haskell

myRecursiveFunction :: [Int] -> [Int] 
myRecursiveFunction (x : xs) = x + 1 : myRecursiveFunction xs 

Ich bin bewusst, dass ich einen iterativen STL-Algorithmus verwenden könnte, wie akkumulieren:

std::vector<int> Example {1,2,3,4,5}; 
std::accumulate(Example.begin() + 1, Example.end(), 0); 

Aber das scheint ziemlich ausführlich, gibt es einfachere Lösungen? Es macht mir nichts aus, wenn die Lösung den Tail kopiert oder anzeigt, ich suche nur nach einer Methode, um einfach auf den Tail eines Vektors zuzugreifen, ohne Iteratoren zu verwenden.

+2

Definieren Sie "den Schwanz eines Vektors erhalten". "[1:]" ist bedeutungslos, in C++. 'std :: accumulate' extrahiert keinen Teil eines Vektors, sondern führt eine Operation im Vektorbereich durch. –

+0

Wie viele verschiedene Interpretationen gibt es vom "Schwanz eines Vektors"? –

+0

@BabraCunningham 1. ein Blick auf den Schwanz, 2. eine Kopie des Schwanzes –

Antwort

5

Verwenden Sie nicht accumulate. Das macht nicht einmal was du willst. Verwenden Sie einfach den Vektorkonstruktor:

std::vector<int>(example.begin() + 1, example.end()); 

Dies erstellt einen neuen Vektor im Speicher und kopiert von Element 1 bis zum Ende. Wenn Sie eine tatsächliche Kennung für sie wollen:

std::vector<int> example_slice(example.begin() + 1, example.end()); 

Wenn Sie versuchen, diese um für eine Art von rekursiven Prozess zu übergeben. Vielleicht möchten Sie es noch einmal überdenken. Vielleicht haben wir es hier mit einem XY-Problem zu tun.

2

in der Nähe von Python, die ich denken kann, ist std::slice:

std::valarray<int> Example {1,2,3,4,5}; 

auto head = Example[std::slice(0, 1, 1)]; 
auto tail = Example[std::slice(1, Example.size() - 1, 1)]; 

nicht so einfach wie Python, aber näher als Ihr eigenes Beispiel.

4

Wenn von "immer den Schwanz des Vektors" Sie Entfernen des ersten Elements oder ersten n Elemente bedeuten, verwenden vector::erase:

example.erase(example.begin()); // remove the first element 

- oder -

example.erase(example.begin(), example.begin()+n); // remove the first n elements 

Wenn durch " Bekommen Sie den Schwanz des Vektors "Sie bedeuten, seinen Schwanz zu einem anderen Vektor zu speichern, verwenden Sie den Bereich Konstruktor:

1

Beachten Sie, dass es keinen "schönen Weg" gibt, einen klaren Schwanz zu erhalten, ohne ihn auf einen anderen Vektor zu kopieren, so dass er ziemlich ineffektiv sein kann. Wenn Sie diesen Endwert schreibgeschützt verwenden möchten, sollten Sie nur zwei Iteratoren für das erste und letzte Endelement speichern:

auto tailBegin = Example.begin() + 1; 
auto tailEnd = Example.end(); 
Verwandte Themen