2015-10-25 20 views
5

वर्तमान में मैं auto keyword.I का उपयोग शुरू करने के लिए सीमा के आधार पर है कि के बारे में कुछ संदेह है:नेस्टेड में (पुनरावृत्ति के लिए) ऑटो का उपयोग पाश

मैं vector पार करने के लिए की जरूरत है मैं करता हूँ:

vector<int>v; 

for(auto it : v){  

    cout << it <<endl; 

} 

लेकिन अगर मैं की तरह कुछ करने की जरूरत है लगता है:

vector<int>v; 

for(auto it:v){  
    for(auto jt:X){ 

    //where X is next position of it's position 
    //What I mean is if it is currently at 2nd position then 
    //jt iterator will start from 3rd position 

    }  
} 

मैं बिल्कुल पता नहीं कैसे सुझाएँ that.Please कि के लिए उपयुक्त तरीका है क्या करना है ।अग्रिम में धन्यवाद।

+1

यह वास्तव में स्पष्ट नहीं आप क्या होने की उम्मीद है। क्या आप एक * अच्छा * (पूरा!) उदाहरण दे सकते हैं? –

उत्तर

3

मुझे लगता है कि आप autoऔर नई रेंज आधारित for पाश का उपयोग करना चाहते।

आप vector_view बना सकते हैं और आंतरिक लूप में "उप वेक्टर" पर फिर से बना सकते हैं।

यहाँ आप आरंभ करने के लिए एक सरल उदाहरण (auto& के उपयोग के नोटिस और नहीं auto) है:

Run It Online

#include <iostream> 
#include <cstddef> 
#include <numeric> 
#include <vector> 
using std::cout; 
using std::endl; 

template <typename T, typename A> 
struct vector_view 
{ 
    using vector_type = std::vector<T, A>; 
    using const_iterator = typename vector_type::const_iterator; 
    using  iterator = typename vector_type::iterator; 

    vector_type& vec; 
    size_t  _begin; 
    size_t  _length; 

    vector_view(vector_type& v, size_t begin_, size_t length_) 
    : vec(v), _begin(begin_), _length(length_) {} 

    const_iterator begin() const { return vec.begin() + _begin; } 
    iterator  begin()  { return vec.begin() + _begin; } 

    const_iterator end() const { return vec.begin() + _begin + _length; } 
    iterator  end()   { return vec.begin() + _begin + _length; } 
}; 

int main() 
{ 
    std::vector<int> v(10); 
    std::iota(v.begin(), v.end(), 0); 

    for (auto& it : v) 
    { 
     size_t begin = std::distance(&v[0], &it) + 1; 
     size_t length = v.size() - begin; 
     vector_view<typename decltype(v)::value_type, 
        typename decltype(v)::allocator_type 
     > vv(v, begin, length); 

     cout << it << ": "; 
     for (auto& jt : vv) 
     { 
      cout << jt << " "; 
     } 
     cout << endl; 
    } 
} 

आउटपुट:

0: 1 2 3 4 5 6 7 8 9 
1: 2 3 4 5 6 7 8 9 
2: 3 4 5 6 7 8 9 
3: 4 5 6 7 8 9 
4: 5 6 7 8 9 
5: 6 7 8 9 
6: 7 8 9 
7: 8 9 
8: 9 
9: 

संपादित: आप वाक्य बना सकते हैं कुल्हाड़ी यदि आप एक make_vector_view() समारोह को परिभाषित कम वर्बोज़:

template <typename T, typename A> 
vector_view<T, A> make_vector_view(std::vector<T, A>& v, 
            size_t    begin_, 
            size_t    length_) 
{ 
    return {v, begin_, length_}; 
} 

और टेम्पलेट तर्क प्रकार कटौती करने के लिए धन्यवाद, आप लिख सकते हैं:

Run It Online

for (auto& it : v) 
{ 
    size_t begin = std::distance(&v[0], &it) + 1; 
    size_t length = v.size() - begin; 

    cout << it << ": "; 
    for (auto& jt : make_vector_view(v, begin, length)) 
    { 
     cout << jt << " "; 
    } 
    cout << endl; 
} 
+2

वाह हाँ वास्तव में सरल और अभिव्यक्तिपूर्ण –

2
auto it:v 

के लिए आशुलिपि है। ..

auto it = v.begin(); it != v.end(); it++ 

तो छोरों के लिए नेस्टेड अंदर ऑटो उपयोग करने के लिए, लंबे समय तक संस्करण अधिक उपयुक्त है ...

#include <iostream> 
#include <vector> 

using namespace std; 

int main() 
{ 
    vector<int> v(10, 17); 
    for (auto& it = v.begin(); it != v.end(); ++it) { 
     for (auto& it2 = it + 1; it2 != v.end(); ++it2) { 
      cout << *it2 << " "; 
     } 
     cout << endl; 
    } 

    // system("pause"); 
    return 0; 
} 
+0

क्या आप वाकई 'ऑटो' और 'ऑटो' के साथ संकलित होंगे? –

+0

वीएस 2015 सामुदायिक संस्करण में यह दोनों के रूप में संकलित करता है। – dspfnder

+0

संकलन-विशिष्ट एक्सटेंशन के कारण: http://ideone.com/D5ZlTq –

संबंधित मुद्दे