簡體   English   中英

c ++從非朋友外部實用程序函數中循環一個類私有unique_ptr數組,而不使用c風格的for循環

[英]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。 問題是我有以下限制:

  1. 不能添加任何公共功能。
  2. 不應該使用友誼
  3. 不應該使用 c 風格的循環(即應該使用算法)。
  4. 不能使用任何 stl 容器。

我不能使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM