標籤:

怎麼返回容器中部分內容的引用?

像vector&v{1,2,3,4,5,6},怎麼返回其中{3,4,5}的引用呢?想重寫一個operator[]像Python中的v[1:3]一樣~


若是提取subrange, 考慮:

std::vector& v {......};
int start = your_start_idx;
int end = your_end_idx;
auto subStart = v.begin() + start;
auto subEnd = v.begin() + end;
std::vector& subVector(subStart, subEnd);

然而你想通過重載operator[]做到Python那種寫法是不能達到的。


返回一個輔助類,給這個輔助類加上range-based for loop的支持。而這個輔助類的迭代器怎麼寫就很隨意了,應該可以實現的想要的功能。

如果你要下標訪問也很簡單,這個輔助類加上[]的重載就是了。

這類需求的主要分歧是,原始數據需不需要拷貝。如果不需要考慮效率,允許拷貝的話,直接把需要的內容抽出來返回個vector就好了。

如果需要考慮的話,相當於只返回了C#里的迭代器,就得弄個自己的類去實現,而數據的來源則是原始的vector。


std::reference_wrapper

#include &
#include &
#include &
#include &
#include &
using namespace std;

int main( void )
{
vector& a{1,2,3,4,5,6};

// 引用 a 中的 {3,4,5}
vector&&> b{ next(begin(a),2), next(begin(a),5) };
for( const auto v : b )
cout &<&< v &<&< " "; // 修改 b[0] 就相當於修改了 a[2] b[0].get() = 100; // 就是這裡丑,沒辦法 assert( a[2] == 100 ); return 0; }


這個似乎有點難度……如果返回滿足條件而不是區間的話,你可以考慮直接返回存著這些元素的指針的vec,或者迭代器


std::pair& 行不?

vector& a{1,2,3,4,5,6};
auto range=std::make_pair(a.begin()+1, a.begin()+4); //獲取2, 3,4這三個元素的迭代器
for(auto it=range.first; it!=range.second; it++)
{
int i=*it;
}


推薦閱讀:

C++中將一個成員函數定義為const的會有助於提高性能嗎?
C++LNK2019錯誤如何解決?
對於 C++ 的疑惑?
vs2010 程序退出的時候崩潰地方,不知道如何解決?

TAG:STL | C |