接受迭代器作为参数的类,并存储值?

时间:2017-08-05 23:34:46

标签: c++ c++11 templates iterator

假设我想实现一个迭代某个范围的类,并将这些值以随机索引存储在数组中。所以我想要一些我能写的东西:

string s = "Steve";
auto r1 = RandomArray<char>(s.begin(), s.end());
int a[] = {1,2,3};
auto r2 = RandomArray<int>(begin(a), end(a));
// Later on...
for (const auto ch: r1) {/* do something */}

我如何定义这样的课程?我无法弄清楚模板应该是什么样子。也就是说,我如何填写下面缺少的内容?

// template stuff
class RandomArray {
    public:
    RandomArray(/* some iterator argument(s) */) {
        // Pretend arr_ has already been sized correctly.
        for (const auto it = /* iterate over iterator */) {
            arr_[randomIndex()] = it;
        }
    }
    private:
    /* Some type */ arr_[];
};

我忽略了我最终需要的所有其他东西(移动构造函数,开始/结束等)。我只想弄清楚类之前的模板语句应该是什么样的。

1 个答案:

答案 0 :(得分:1)

这些方面的东西(未经测试):

template <typename Elem>
class RandomArray {
public:
  template <typename InputIter>
  RandomArray(InputIter first, InputIter last)
    : storage(first, last) {}

  template <typename Container>
  explicit RandomArray(const Container& c)
    : storage(std::cbegin(c), std::cend(c)) {}

  // For C-style array
  template <typename Elem2, size_t N>
  explicit RandomArray(Elem2 (&arr)[N])
    : storage(std::cbegin(arr), std::cend(arr)) {}

private:
  std:vector<Elem> storage;
};

template <typename InputIter>
auto MakeRandomArray(InputIter first, InputIter last) {
  return RandomArray<typename std::iterator_traits<InputIter>::value_type>(
    first, last);
}

template <typename Container>
auto MakeRandomArray(const Container& c) {
  return RandomArray<typename Container::value_type>(c);
}

// For C-style array
template <typename Elem, size_t N>
auto MakeRandomArray(Elem (&arr)[N]) {
  return RandomArray<Elem>(arr);
}
相关问题