【问题标题】:Create a const std::vector with another const std::vector and additional values使用另一个 const std::vector 和附加值创建一个 const std::vector
【发布时间】:2020-03-23 12:41:38
【问题描述】:

考虑一个常量向量v1

const std::vector<int> v1{0, 1, 2, 3, 4};

我想创建一个新的 const 向量 v2,其中包含向量 v1 的内容,附加值如下:

const std::vector<int> v1{0, 1, 2, 3, 4};
const std::vector<int> v2{v1, 5, 6, 7, 8, 9};

我该怎么做?

【问题讨论】:

  • 创建一个临时向量,构建它的内容,然后用它来构建v2。或者,定义并实现一个自定义迭代器类,它迭代v1 的所有内容和新值,并使用std::vector 构造函数,它是一个模板,它采用由开始和结束迭代器定义的序列。
  • 我目前有一个函数,它结合了v1 和附加值并返回一个新的向量来构造,但我想问是否有更优雅的解决方案来解决这个问题
  • C++ 库中没有这方面的内容。
  • 这也是我的猜测,但我不太确定
  • 我确信 C++ 库中没有这样的东西的原因是因为这样的事情只能通过两种方式完成。 1)一个专用的向量构造函数,我很确定没有; 2) 我很确定 C++ 语言语法和句法的基本部分不存在。没有其他可能。

标签: c++ vector stl std


【解决方案1】:

考虑以下便利函数模板,make_vector()

template<typename T>
std::vector<T> make_vector(const std::vector<T>& v, std::initializer_list<T> l) {
   std::vector<T> u(v);
   u.insert(u.end(), l.begin(), l.end());
   return u;
}

它创建一个临时向量u,其中包含传递给函数的向量元素和initializer_list 的元素。

请注意,便利函数按值返回const 对象通常意义不大(例如,返回的对象不能移动)。因此,上面的便捷函数返回一个非const 向量,即std::vector&lt;T&gt;。但是,您可以使用这个返回的非const 向量初始化一个const 向量,它将被移动初始化。

auto main() -> int {
   const std::vector<int> u{1, 2, 3};
   auto const v = make_vector(u, {4, 5, 6});

   for (auto elem: v)
      std::cout << elem << ' ';
   std::cout << '\n';
}

输出:

1 2 3 4 5 6 

【讨论】:

  • 感谢您抽出宝贵时间回答这个问题,我已经按照您描述的方式解决了问题,但我的问题是,是否有更优雅的解决方案来解决这个问题,例如 const std::vector&lt;int&gt; v2{v1, 5, 6, 7, 8, 9};
  • @emm 我能想到的另一种方法是创建自己的类型,该类型在构造时采用向量和initializer_list,并提供begin()end() 成员函数。
猜你喜欢
  • 1970-01-01
  • 2021-06-02
  • 2021-11-10
  • 1970-01-01
  • 2019-10-20
  • 2014-12-12
  • 2019-11-07
  • 2021-03-21
  • 2020-08-17
相关资源
最近更新 更多