将 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()
{
}
我没有玩范围,但似乎他们有解决方案:
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}}; });