【问题标题】:Constructor for wrapper around std::vectorstd::vector 周围包装器的构造函数
【发布时间】:2013-08-29 16:22:42
【问题描述】:

我正在尝试使用数据成员 std::vector 编写包装类。我的类的默认构造函数应该是什么样子,这样我就可以在不超出范围错误的情况下执行以下操作:

Wrapper W;
W[0] = value;  //overloaded index operator, forwards to the vector

【问题讨论】:

  • 也许构造函数应该什么都不做,而operator[] 应该检查向量的大小和resize() 以确保i 在范围内(注意使以前的引用无效)?否则,这完全是猜测向量应该有多大,所以没有人能真正说出你的默认构造函数应该是什么样子。
  • 抱歉打错字了,我的意思是 W[0] 而不是 W[i]。
  • 如果你想要的只是W[0],那么构造函数可以是Wrapper() : m_vector(1) {}
  • 这是一个很大的错字
  • @john 辜负我的用户名,不是吗?

标签: c++ stdvector


【解决方案1】:

您必须在访问元素之前调整向量的大小:

// in the class definition
std::vector vec;

T &operator[](typename std::vector<T>::size_type idx)
{
    if (idx >= vec.size()) {
        vec.resize(idx + 1);
    }

    return vec[idx];
}

编辑: 现在是 0 而不是 i,这是一个巨大的错字。在这种情况下,您可以就地构造一个大小为 1 的向量:

std::vector<T> vec = std::vector<T>(1);

public:
T &operator[](typename std::vector<T>::size_type idx)
{
    return vec[idx];
}

【讨论】:

    【解决方案2】:

    默认构造函数无关紧要。您的 operator [] 需要检查提供的索引是否超出范围并根据需要使向量更大。 (我在这里假设“返回对vector&lt;T&gt; 的引用”是一个错字,您想在某个时候转发到向量的operator[])。

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      相关资源
      最近更新 更多