2010-11-18 7 views
10

मैं सी में निम्न कार्य करना एक पठनीय, सुरुचिपूर्ण तरीका रहा हूँ के साथ शुरू iterators ++, यहां अजगर में दिखाया गया है पर लूपिंग:सी ++ दूसरे (या वें) आइटम

for datum in data[1:]: 
    do work. 

प्रश्न में डेटा पर iterators रैंडम एक्सेस iterators समर्थन कर सकते हैं नहीं, तो मैं बस का उपयोग नहीं कर सकते हैं:

iterable::iterator mIter = data.begin(); 
for (mIter++; mIter != allMjds.end(); mjdIter++) { 
    do work. 
} 
:

for (mIter = data.begin() + 1; mIter != data.end(); mIter++) 

सबसे अच्छा मैं ले कर आए हैं निम्नलिखित है 0

यह बहुत लंबा नहीं है, लेकिन यह शायद ही कभी एक्सपोज़िटरी है - पहली नज़र में यह वास्तव में एक गलती की तरह दिखता है!

एक और समाधान "एनएच तत्व" सहायक कार्य है, मुझे लगता है। कोई कूलर विचार?

+3

यह 'कथन' के पहले भाग के लिए '++ mIter' होना चाहिए। –

+1

सचमुच, मुझे सी ++ संस्करण अधिक पठनीय लगता है। –

+2

@ नोहा, मैं नहीं करता। मेरी इच्छा है कि सी ++ पायथन जैसे स्लाइस कर सके। (बेशक यह सी ++ 0x में foreach करने में सक्षम हो जाएगा।) – avakar

उत्तर

22

आप रैखिक-समय अग्रिम के लिए std::next(iter, n) का उपयोग कर सकते हैं। आप मानक std::advance एल्गोरिदम का भी उपयोग कर सकते हैं, हालांकि यह उपयोग करने में आसान नहीं है (यह एक गैर-कॉन्स्ट संदर्भ द्वारा इटरेटर लेता है और इसे वापस नहीं करता है)।

उदाहरण के लिए

,

for (mIter = std::next(data.begin()); mIter != data.end(); ++mIter) 

या,

mIter = data.begin(); 
std::advance(mIter, 1); 
for (; mIter != data.end(); ++mIter) 

ध्यान दें कि आपको लगता है कि data.size() >= 1 सुनिश्चित करें चाहिए, अन्यथा कोड एक भयावह ढंग से असफल हो जायेगी।

+1

'बूस्ट :: अगला' के लिए लाइब्रेरी क्या है? धन्यवाद –

+1

@ स्टेव टाउनसेंड: उपयोगिता। http://www.boost.org/doc/libs/1_44_0/libs/utility/utility.htm#functions_next_prior –

+0

@Fred, @avakar - धन्यवाद ... –

5
#include <iterator> 

iterator iter = data.begin(); 
for (advance(iter, 1); iter != data.end(); ++iter) 
{ 
    // do work 
} 

यह एक अपवाद से बचने के लिए, हालांकि data में> = 1 तत्व पर निर्भर करता है।

+1

+1, टिप्पणी है कि कोई अपवाद नहीं है जब पूर्व शर्त को पूरा नहीं कर रहा है इसका मतलब है "इस' डेटा' में> 1 तत्व पर निर्भर करता है "के साथ (सामान्य रूप में, कि है)। –

+3

'अग्रिम' कॉल का उपयोग इनिट स्टेटमेंट के रूप में करते हुए, अच्छा स्पर्श! :) +1 – avakar

+2

आपका मतलब है कि कोड 0 से अधिक तत्वों पर निर्भर करता है। – wilhelmtell

1

आप को बढ़ावा देने :: इस के लिए अगले उपयोग कर सकते हैं (लेकिन आप यह सुनिश्चित करें कि सूची वास्तव में ऐसा करने से पहले यह में एक तत्व है होना चाहिए):

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <list> 

#include <boost/assign.hpp> 
#include <boost/next_prior.hpp> 
using namespace boost::assign; 

int main() 
{ 
    std::list<int> lst = list_of(23)(9)(84)(24)(12)(18); 
    std::copy(boost::next(lst.begin()), lst.end(), std::ostream_iterator<int>(std::cout, " ")); 
    return 0; 
} 
1
iterable::iterator mIter = data.begin();  
std::for_each(++mIter, data.end(), some_func); 

जहां some_func कोड आप चाहते हैं निष्पादित करने के लिए ... आप इसे एक सरल आवरण समारोह के साथ भी महत्वहीन सकता

template <typename _cont, typename _func> 
for_1_to_end(_cont const& container, some_func func) 
{ 
    typename _cont::const_iterator it = _cont.begin(); 
    std::for_each(++it, _cont.end(), func); 
} 
2

आप की कोशिश कर सकते:

for (mIter = data.begin() ; ++mIter != data.end() ;) 

लेकिन आपको यह सुनिश्चित करना होगा कि data.begin() == data.end()++mIter कर कोई समस्या नहीं पैदा करता है।

चूंकि यह लूप के लिए एक गैर-मानक है, इसलिए थोड़ी देर के लिए लूप का उपयोग करना अधिक उचित हो सकता है क्योंकि वे कैसे काम करते हैं, इसके बारे में कम पूर्वकल्पित विचार हैं, यानी आपके कोड को देखने वाले लोग अधिक से अधिक वक्तव्य पढ़ने की संभावना रखते हैं बयान के रूप में आमतौर पर एक मॉडल है कि उनके सिर में लूप को कैसे काम करना चाहिए।

mIter = data.begin(); 

while (++mIter != data.end()) 
{ 
} 
संबंधित मुद्दे