【问题标题】:How should I index a private vector from outside the class?我应该如何索引课堂外的私有向量?
【发布时间】:2013-08-11 15:06:45
【问题描述】:

假设我有这样的情况:

class A {
private:
    std::vector<X> _v;
    // ...
public:
    A();
    // ...
};

并假设我需要限制对矢量元素的访问以进行编辑和/或阅读。我应该使用什么类型的索引(intlongstd::size_t、自定义迭代器或其他)从 A 类外部指定向量中的元素?

以下索引是否正确?

class A {
    // ...
    X getVectorElement(std::size_t);
    void editSomeElementValue(std::size_t, double); // double is the type of the value to edit
};

我还有什么其他选择?

【问题讨论】:

  • 严格来说,索引类型是std::vector&lt;T&gt;::size_type,虽然这通常与std::size_t相同。

标签: c++ stl containers std size-t


【解决方案1】:

您也可以使用size_type 作为索引 - 与您的向量类型相同:

// Make your own type for the index based on the vector's index type
typedef std::vector<X>::size_type size_type;
// Use your typedef in the declaration of your getter
X getVectorElement(size_type index);

返回一个副本是个好主意 - 事实上,如果您想对调用者隐藏向量,这是最好的做法。返回指针或引用可能会更高效,但在 X 是可变的情况下,它会打开你的类进行后门操作。如果在返回引用后修改向量也会产生问题,因为更改向量会使对其元素的引用无效。

您可以提供单独的函数来操作X 的属性,但您也可以提供一个设置器,让用户替换向量的元素。

【讨论】:

    【解决方案2】:

    使用最适合您班级设计的内容。您的班级在内部使用std::vector这一事实无关紧要;类接口不应该由实现细节驱动。任何调整,无论是值还是类型,都可以在您的班级内部完成。所以使用std::size_tunsigned 或其他。

    【讨论】:

    • “类接口不应该由实现细节驱动”——这就是让我想到的。使用 std::vector&lt;X&gt;::size_type 不会真正“隐藏”实现。 std::size_t 那么合适吗?
    【解决方案3】:

    size_typestd::vector&lt;X&gt;类型的静态成员类型

    它是std::size_t的typedef,它本身通常是unsigned intunsigned long long的typedef

    因此可以使用std::vector&lt;X&gt;::size_type 或仅使用std::size_t 进行索引。

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多