2016-11-07 20 views
0

是否有可能獲得對數組元素的稀疏(非連續)子集?獲取數組的稀疏子集作爲參考

假設我有數組a = [1,4,5]和索引pos = [0,1]。我想獲得b = [1,5]而不復制a中的元素。換句話說,我想切入a並創建一個名爲b的視圖。

以下錯誤,因爲 「表達不可分配」:

#include <array> 

int main() { 
    std::array<double,3> a = {1, 4, 5}; 
    std::array<double, 2> b; 
    int c = 0; 
    int pos[2] = {0,2}; 
    for (auto i = a.begin(); i != a.end(); i++) { 
    &b[c] = i; 
    i++; 
    } 
    return 0; 
} 
+1

您不能擁有一個引用容器。你會得到最接近的是一個指針的容器,而不會複製'a'。 –

+0

看看['std :: ref'](http://en.cppreference.com/w/cpp/utility/functional/ref) – StoryTeller

回答

1

你不能有在容器中直接引用。但是,如果你有機會到C++ 11 you can use std::reference_wrapper

#include <iostream> 
#include <functional> 
#include <vector> 
#include <array> 

int main() { 
    std::array<double,3> a = {1, 4, 5}; 
    std::vector<std::reference_wrapper<double>> b; 
    int pos[2] = {0,2}; 
    for (unsigned int i = 0; i < sizeof(pos)/sizeof(pos[0]); ++i) 
    { 
     b.emplace_back(a[pos[i]]); 
    } 

    for(const auto& viewer: b) 
    { 
     std::cout << viewer << "\n"; 
    } 
} 

否則,只需使用double*

+0

如果稀疏率僅爲50%,您是否認爲這比元素的複製效率更高? – Oleg

+1

@Oleg由於'emplace_back'在原地建造並且不會複製'reference_wrapper',所以這通常會非常快。但是,如果你的數據類型只是一個'雙',我毫不懷疑複製一些元素也會很快。哪一個比另一個快?只有基準可以幫助你。 –

+0

我測量了這種方法的執行時間,將這些值複製到一個新的向量中。 'a'數組有1e5個元素,稀疏度爲50%,操作循環100次。該副本速度提高了兩倍以上。不成熟的優化字節我的a **再次... – Oleg

0

C++標準8.3.2/4:

須有至沒有引用任何參考文獻,沒有引用的數組, 並且沒有指向引用的指針。

Answered here

但是你可以有一個全球化志願服務青年成員(initlized上constractor)一類的容器陣列和實施=運營商,如果它是值得的

+0

是的,我知道這個說法,這解釋了爲什麼我得到錯誤。 – Oleg