2014-11-20 79 views
2

我有一個矢量v其大小是10和定義爲
vector<int> v(10, 1);更新向量通過子向量指針/視圖/參考

我想利用v一個段,例如

vector<int> segment_of_v(&v[5], &v[10]);

現在,我想更新segment_of_v

segment_of_v = 5 * segment_of_v;

但我希望這樣的更新也反映在原始矢量v

我想通過使指針segment_of_v來做到這一點,但是,我無法做到這一點segment_of_v*。有什麼建議麼?

+0

你真的需要'segment_of_v'是一個矢量''?你需要'segment_of_v'嗎? – juanchopanza 2014-11-20 16:57:42

+1

您正在尋找'array_view '的一些變體。不幸的是,'array_view'不存在。然而。 – 2014-11-20 16:58:33

+0

segment_of_v和v應該是相同的類型。正如Kerrek指出的,我正在尋找像array_view 之類的東西。 – musafir 2014-11-20 17:03:07

回答

2

您無法制作segment_of_v a vector<int>,因爲那會創建第二個不相關的vector

你可以做int* segment_of_v = &v[5],但這隻會給你一個普通的指針,不能像vector一樣使用。這可能是危險的,因爲當你操縱原始的v時,它可能被重新分配,並且這個指針將變爲無效。

2

爲什麼它如此複雜?

你可以簡單地寫

std::for_each(std::next(v.begin(), 5), v.end(), [](int &x) { x *= 5; }); 

或者,如果你想用向量合作與數組,然後你可以使用成員函數data。例如表達式

v.data() + 5 

將給出您的範圍的初始指針。

1

你可以做到這一點使用std::transform

std::transform(v.begin() + 5, v.end(),  // start, end 
       v.begin() + 5 ,    // destination 
       [](int x) { return x * 5; } // Lambda 
       ); 

here

+0

在我的問題中,我已經展示了一個轉換作爲例子。我想用segment_of_v做很多的運算。有時候我想把這個segment_of_v傳遞給某個函數。因此,我需要segment_of_v的系統定義。 – musafir 2014-11-20 17:10:01

+0

@musafir你可以隨時將一元函數對象傳遞給包裝這個'std :: transform'的包裝器,我也只是顯示了_「one」_ example;) – P0W 2014-11-20 17:11:57

+0

@POW謝謝。我會試試這個。 – musafir 2014-11-20 17:17:34