2017-07-20 12 views
6

मान लीजिए कि मेरे पास टी के नाम से आरएनजी है। अब मैं टी की सीमाओं की एक सीमा जा रहा हैश्रेणियों की श्रेणी वेक्टर के वेक्टर

auto groups = ranges::view::group_by(rng, bin_op); 

समूहों कर सकते हैं।

मैं भी टी की सीमाओं का एक वेक्टर प्राप्त करने के लिए इस

auto groups = ranges::view::group_by(rng, bin_op) | ranges::to_vector; 

कर सकते हैं। हालांकि इस

auto groups = ranges::view::group_by(rng, bin_op) 
      | ranges::to_vector 
      | ranges::action::transform([] (auto r) { return r | ranges::to_vector; }; 

के साथ-साथ

auto groups = ranges::view::group_by(rng, bin_op) 
      | ranges::to_vector 
      | ranges::action::transform([] (auto r) { return std::vector<T>{} | ranges::action::push_back; }; 

जाहिरा तौर पर के बाद से काम नहीं करेगा पर्वतमाला :: कार्रवाई :: बदलने() "इस मामले में शून्य रिटर्न और समारोह के परिणाम प्रकार कार्रवाई करने के लिए पारित किया :: परिवर्तन स्रोत सीमा में वापस लिखने योग्य होना चाहिए "।

तो मैं श्रेणियों की वेक्टरों को वेक्टरों के वेक्टर में कैसे बदलूं?

नोट: खराब टैग के लिए खेद है, लेकिन मुझे श्रेणियां/श्रेणी-ts/ranges-v3 टैग नहीं मिल सका, मुझे एक बनाने की अनुमति नहीं है और इसे शीर्षक में उपयोग नहीं किया जा सका।

उत्तर

3

आप यह मानते हुए Rangesv3 उपयोग कर रहे हैं, डॉक्स की मेरी पढ़ने मुझे कुछ इस तरह देता है:

auto groups = ranges::view::group_by(rng, bin_op) 
     | ranges::view::transform(ranges::to_vector) 
     | ranges::to_vector; 

या शायद

auto groups = ranges::view::group_by(rng, bin_op) 
     | ranges::view::transform([] (auto r) { return r | ranges::to_vector; }) 
     | ranges::to_vector; 

(मुझे याद है कि ranges::to_vector एक समारोह शैली में इस्तेमाल किया जा सकता रास्ता, लेकिन मैं गलत हो सकता था, या चीजें बदल सकती थीं। पहला मानता है कि यह हो सकता है; दूसरा नहीं है।)

यह क्या करता है यह पहला रूपांतरण है श्रेणियों की आलसी रेंज वैक्टर की आलसी रेंज में है।

यह वैक्टरों की आलसी श्रेणी में वैक्टरों की आलसी रेंज को बदल देता है।

यह बेहतर (अंदर से बाहर) काम करता है क्योंकि मध्यवर्ती उत्पादों आलसी "बाहर की दुनिया में" कर रहे हैं। वहाँ बाहर-इन यह करने के लिए एक तरीका हो सकता है, लेकिन आलसी पर्वतमाला का एक वेक्टर वास्तव में एक तरीका है कि वैक्टर की एक आलसी सीमा नहीं है में अस्तित्व में है।

+0

वास्तव में यह काम करता है। तो विचार अंदर से बाहर के अंदर के अंदर से बाहर के रूप में काम करना है। कोई विचार क्यों दूसरी दिशा काम नहीं करेगा? –

+1

@rich शायद यह हो सकता है, लेकिन यह अक्षम होगा क्योंकि वैक्टर मौजूद जबकि पर्वतमाला आलसी होते हैं। आप 0 लागत के लिए वैक्टरों की मध्यवर्ती आलसी रेंज प्राप्त कर सकते हैं, लेकिन आलसी श्रेणियों का एक मध्यवर्ती वेक्टर मौजूद होना चाहिए और इसकी लागत होनी चाहिए। – Yakk

+0

यह पूरी तरह से समझ में आता है। किंडा शर्मनाक है कि मेरी हास्केल मस्तिष्क नोटिस नहीं किया था ... मदद के लिए धन्यवाद। –

6

आप केवल vector<vector<T>> पर परिणाम असाइन कर सकते हैं और सही बात होगी। उदाहरण के लिए:

#include <vector> 
#include <iostream> 
#include <range/v3/core.hpp> 
#include <range/v3/view/all.hpp> 
#include <range/v3/view/group_by.hpp> 
#include <range/v3/view/transform.hpp> 

int main() { 
    std::vector<int> rng {0,1,2,3,4,5,6,7,8,9}; 
    auto groups = ranges::view::group_by(rng, [](int i, int j){ 
     return j/3 == i/3; 
    }); 

    std::vector<std::vector<int>> vs = groups; // WORKS 

    // Display the result: [[0,1,2],[3,4,5],[6,7,8],[9]] 
    std::cout << ranges::view::transform(vs, ranges::view::all) << std::endl; 
} 
+2

ओह वाह - कि प्रत्याशित की तुलना में जिस तरह से अधिक आसान है;) मैं वास्तव में चाहते हैं डॉक्स अधिक detailled किया जाएगा - बहुत सी बातें मैं नहीं मिलता है ... (std :: निकट भविष्य में मल्टीमैप बारे में एक प्रश्न की उम्मीद) –