1

假设我有这样的情况:

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
};

我还有什么其他选择?

4

3 回答 3

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,但您也可以提供一个设置器,让用户替换向量的元素。

于 2013-08-11T15:17:39.343 回答
1

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

于 2013-08-11T15:36:47.237 回答
0

size_type是类型的静态成员类型std::vector<X>

它是一个 typedef for std::size_t,它本身通常是一个 typedef for unsigned intorunsigned long long

因此可以使用std::vector<X>::size_type或仅std::size_t用于索引。

于 2013-08-11T15:18:08.300 回答