tuket
tuket

Reputation: 3941

Simplest way to assign std::span to std::vector

I wanted to do this

#include <vector>
#include <span>

struct S
{
    std::vector<int> v;
    void set(std::span<int> _v)
    {
        v = _v;
    }
};

But it does not compile. What are the alternatives?

Upvotes: 14

Views: 12725

Answers (4)

Toby Speight
Toby Speight

Reputation: 30888

The general way to create a new container from any input range is std::ranges::to():

        v = _v | std::ranges::to<decltype(v)>();

This is more useful for passing a temporary to a function that's more constrained (e.g. it needs a sized or bidirectional range), but it can be used for assignment, too (at a short-term cost in memory, since v's contents are not released until after the new container is constructed).

Upvotes: 3

Use std::vector<T,Allocator>::assign_range (C++23).

v.assign_range(_v);

// or “v.assign(_v.begin(), _v.end());”

Upvotes: 4

JeJo
JeJo

Reputation: 32847

You can also use the std::vector::insert as follows:

v.insert(v.begin(), _v.begin(), _v.end());

Note that, if the v should be emptied before, you should call v.clear() before this. However, this allows you to add the span to a specified location in the v.

(See a demo)

Upvotes: 4

yuri kilochek
yuri kilochek

Reputation: 13486

v.assign(_v.begin(), _v.end());

Upvotes: 23

Related Questions