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.
Although std::vector can be used as a dynamic array, it can also be used as a stack.
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With