将向量<t *>移动到向量<const t * =“”>

时间:2018-03-05 11:26:24

标签: c++ vector const

是否可以将vector<T*>移至vector<const T*>而无需复制,而无需依赖reinterpret_cast<>?即。

vector<int*> get() {
   return ...;
}

vector<const int*> getConst() {
   return whatgoeshere(get());
}

2 个答案:

答案 0 :(得分:6)

我将从另一个角度攻击这个。并解决可能的设计问题。你没有指定...中的内容,但假设get填充了一个向量然后返回它,我的视图中的解决方案就是提升在两个功能。

template<typename Int>
void do_get(std::vector<Int*>& v) {
  // Populate v
}

auto get() {
   std::vector<int*> ret;
   do_get(ret);
   return ret;
}

auto getConst() {
   std::vector<const int*> ret;
   do_get(ret);
   return ret;
}

填充逻辑的一个真实来源。虽然两个原始功能相同,但它可以忽略不计。此外,在一个理智的实施中,它不会做任何多余的副本,因为RVO是惊人的。

答案 1 :(得分:4)

虽然T*可以简单地转换为const T*,但T*的容器与const T*的容器没有“关联”,所以根本就没有做你要求的功能。

还要考虑这样的功能可能假设将int**分配给const int**,这是不允许的(没有特殊情况提供程序员打算将此分配作为一部分进行交换操作,据我所知)。

此外,reinterpret_cast只会对这些事实进行黑客攻击,使您的程序行为不明确。

你有三个选择:

  • 复制矢量( O(n)
  • 让它首先让你拥有你想要的容器( O(∞)
  • 使它完全不需要新的容器类型( O(?)