将多个不可复制的值插入到 `std::vector`

问题描述 投票:0回答:1

将 N 个值一一插入到

std::vector
中效率很低。 因此,您可以一次性插入它们。

我的问题是我的价值观不可复制构造。

所以,问题是如何使以下代码正常工作,而不需要一一插入值。

是否有一个映射过程需要一个

std::string
和一个
DOMObject*
并给出一个
Field
?是否有移动语义馈送到
std::vector

#include <span>
#include <concepts>
#include <iterator>
#include <iostream>
#include <string>
#include <memory>
#include <vector>

using namespace std;


class DOMObject {};


struct Field
{
    std::string key;
    std::unique_ptr<DOMObject> value;
};


std::vector<Field> fields;


void insert_many(size_t pos, const std::span<string> &keys, const std::span<DOMObject*> &values)
{
    fields.insert(fields.begin() + pos, values.size(), {});  // Copy construction is not allowed
    for (size_t i = 0; i < values.size(); ++i)
    {
        fields[pos + i].key = std::move(keys[i]);
        fields[pos + i].value.reset(values[i]);
    }
}


int main()
{
}
c++ move-semantics c++23
1个回答
0
投票

我没有玩范围,但似乎他们有解决方案:

    std::transform(keys.begin(), keys.end(), values.begin(),
                std::inserter(fields, fields.begin() + pos),
                [](std::string &key, DOMObjectType *value) -> Field
                        { return {std::move(key), unique_pointer{value}}; });
© www.soinside.com 2019 - 2024. All rights reserved.