30 template <
class... Args>
32 concatenate(
const std::vector<Args...>& lhs,
const std::vector<Args...>& rhs)
34 std::vector<Args...> conc = lhs;
35 std::copy(rhs.begin(), rhs.end(), std::back_inserter(conc));
39 template <
class KeyT,
class ValueT>
40 std::map<KeyT, ValueT>
43 const size_t size =
std::min(lhs.size(), rhs.size());
45 std::map<KeyT, ValueT> map;
46 for (
size_t i = 0; i < size; ++i)
48 map.emplace(lhs[i], rhs[i]);
53 template <
class KeyT,
class ValueT>
55 multi_at(
const std::map<KeyT, ValueT>& map,
56 const std::vector<KeyT>& keys,
57 bool skipMissing =
false)
59 std::vector<ValueT>
values;
60 values.reserve(keys.size());
62 for (
const KeyT& key : keys)
66 if (
auto it = map.find(key); it != map.end())
68 values.push_back(it->second);
74 values.push_back(map.at(key));
81 template <
class... Args>
83 slice(
const std::vector<Args...>& vector,
85 std::optional<size_t> end = std::nullopt)
87 std::vector<Args...> result;
88 auto beginIt = vector.begin() + start;
89 auto endIt = end ? vector.begin() + *end : vector.end();
90 std::copy(beginIt, endIt, std::back_inserter(result));