【问题标题】:Insert an element into a range将元素插入范围
【发布时间】:2021-11-09 22:15:37
【问题描述】:

下面代码中Insert方法的正确实现是什么?

#include <ranges>
#include <vector>
#include <set>

template <std::ranges::range Range>
class Processor
{
public:

    using T = std::ranges::range_value_t<Range>;

    void Insert(Range range, T val)
    {
        //add val into range
    }
};

int main()
{
    std::vector<int> v;

    Processor<std::vector<int>> p;
    p.Insert(v, 5);

    std::set<int> set;

    Processor<std::set<int>> p1;
    p.Insert(set, 5);

    return 0;
}

是否可以使用相同的代码插入vectorset? (插入vector可能是push_back

【问题讨论】:

  • 在您的std::vector 中插入项目是否重要?
  • @DrewDormann 是的,应该插入到vector的末尾
  • 上次我检查的范围是适配器,因此是视图,它们不会修改任何内容...您需要插入容器。
  • @Mgetz std::ranges::output_range 比是什么?
  • @AlexeyStarinsky 所以我能够让std::ranges::output_rangegodbolt 上工作,但它没有插入......它正在替换。您不能插入范围,只需替换它的部分。我打算将其放入答案中,但这不是对所提问题的答案。

标签: c++ c++20


【解决方案1】:

是否可以插入向量并使用相同的代码进行设置? (插入vector大概是push_back)

如果你想为 set 和 vector 调用相同的函数,你可以使用模板、constexpr if 和 std::same_as 尝试这个灵魂。
示例:

#include <ios>
#include <iostream>
#include <set>
#include <type_traits>
#include <vector>
template <typename Range, typename T>
void
insertInSetOrVector (Range &range, T const &t)
{
  if constexpr (std::same_as<std::vector<T>, Range>)
    {
      range.push_back (t);
    }
  else if constexpr (std::same_as<std::set<T>, Range>)
    {
      range.insert (t);
    }
}

int
main ()
{
  auto vec = std::vector<int>{};
  insertInSetOrVector (vec, 42);
  auto set = std::set<int>{};
  insertInSetOrVector (set, 42);
  std::cout << "vector: " << vec.at (0) << std::endl;
  std::cout << std::boolalpha << "set has 42: " << (set.count (42) == 1) << std::endl;
  return 0;
}

哪个打印:

vector: 42
set has 42: true

编辑:感谢您的建议(set.count (42) == 1)更准确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多