[英]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.