Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does structured binding work with std::vector?

Is it possible to use structured binding with vectors?

E.g.

std::vector<int> vec{1, 2, 3}; auto [a, b, c] = vec; 

Above code unfortunately doesn't work (under GCC), but maybe there's a different way (with structured binding) that allows to assign the first three values of a vector to three variables.

like image 558
BartekPL Avatar asked Jun 28 '18 07:06

BartekPL


People also ask

Is std::vector on the stack?

Although std::vector can be used as a dynamic array, it can also be used as a stack.

What is a structured binding?

Binds the specified names to subobjects or elements of the initializer. Like a reference, a structured binding is an alias to an existing object. Unlike a reference, a structured binding does not have to be of a reference type.

What data structure is C++ vector?

Vectors in C++ are sequence containers representing arrays that can change in size. They use contiguous storage locations for their elements, which means that their elements can also be accessed using offsets on regular pointers to its elements, and just as efficiently as in arrays.

Is std::vector slower than array?

A std::vector can never be faster than an array, as it has (a pointer to the first element of) an array as one of its data members. But the difference in run-time speed is slim and absent in any non-trivial program. One reason for this myth to persist, are examples that compare raw arrays with mis-used std::vectors.


1 Answers

Structured binding only works if the structure is known at compile time. This is not the case for the vector.

While you do know the structure of the individual elements, you do not know the number of elements, and that is what you are trying to decompose on in your question. Similarly, you can only use structured bindings on array types where the size is known at compile time. Consider:

void f(std::array<int, 3> arr1,        int (&arr2)[3],        int (&arr3)[]) {     auto [a1,b1,c1] = arr1;     auto [a2,b2,c2] = arr2;     auto [a3,b3,c3] = arr3; } 

The first two will work, but the last line will fail to compile, because the size of arr3 is not known at compile time. Try it on godbolt.

like image 82
ComicSansMS Avatar answered Sep 21 '22 18:09

ComicSansMS