[英]c++ loop through a class private unique_ptr array from non-friend external utility function without using c-style for loop
我有一堂课:
class vector_class {
private:
std::unique_ptr<int[]> my_vector;
int size_;
public:
auto at(int) const -> int; // returns value at subscript
auto at(int) -> int&;
auto size() -> int; // returns vector size
}
我被要求构建一个外部函数,该函数采用其中 2 个对象并返回 inner_product。 问题是我有以下限制:
我不能使用 for_each 因为我没有迭代器(因为向量是私有的非朋友)。 我不能 for (i = 0; i < a.size(); ++i) ... (因为没有基本的 for 循环)。
我想我可以编写一个自定义迭代器类,但这是很多工作并且想知道我是否错过了一个更简单的解决方案......有什么建议吗?
迭代器旨在模拟指针的大部分行为,以至于所有指针都可以用作迭代器。
因此,如果您有一个数组,以及数组中的元素数量,您可以使用指向数组第一个元素的指针作为begin
迭代器。 以及指向最后一个元素之外的一个元素的指针(即begin + size
)作为end
迭代器。 然后,您可以将这些“迭代器”与任何需要迭代器对的普通标准函数一起使用。
对于您的具体情况, &my_vector[0]
作为开始, &my_vector[size_]
作为结束。
现在,由于您的练习的限制和要求,最简单的解决方案可能是通过公共at()
函数获取这些指针。 或者,如果该类有一个重载的operator[]
你可以使用它来代替:
inner_product(&i[0], &i[i.size()], &j[0]);
因为at
函数有两个重载(如果存在的话,可能还有[]
运算符的重载),如果编译器没有选择正确的重载开始,我们可能需要专门要求返回引用的重载。
这可以通过定义我们自己的临时引用变量来完成:
auto const& first_begin = i[0];
auto const& first_end = i[i.size()];
auto const& second_begin = j[0];
auto result = inner_product(&first_begin, &first_end, &second_begin, 0);
或者,由于at
函数似乎具有适当的返回引用重载,因此您可以使用它来代替[]
:
auto result = inner_product(&i.at(0), &i.at(i.size()), &j.at(0), 0);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.