怎麼返回容器中部分內容的引用?
像vector&
v{1,2,3,4,5,6},怎麼返回其中{3,4,5}的引用呢?想重寫一個operator[]像Python中的v[1:3]一樣~
若是提取subrange, 考慮:
std::vector&
int start = your_start_idx;
int end = your_end_idx;
auto subStart = v.begin() + start;
auto subEnd = v.begin() + end;
std::vector&
然而你想通過重載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 中的 {3,4,5}
vector&
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&
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 程序退出的時候崩潰地方,不知道如何解決?