2016-02-23 8 views
8

में तत्वों के आधार पर` std :: vector` को टुकड़ा कैसे करेंमें तत्वों के आधार पर std::vector स्लाइस करने का कोई अच्छा तरीका है? दूसरे शब्दों में, std::set के तत्व वेक्टर में जो इंडेक्स चाहते हैं उन्हें पकड़ें। निश्चित रूप से, मैं कोड के साथ ऐसा कर सकते हैं:`std :: set`

#include <set> 
#include <vector> 
#include <iostream> 
#include <iterator> 

template <typename T> 
std::vector <T> slice(
    std::vector <T> const & x, 
    std::set <unsigned int> const & I 
) { 
    auto y = std::vector <T>(); 
    for(auto const & i : I) 
     y.push_back(x[i]); 
    return y; 
} 

int main() { 
    auto x = std::vector <double> { 1.2, 2.3, 3.4, 4.5, 5.6}; 
    auto I = std::set <unsigned int> { 0, 3, 4}; 
    auto y = slice(x,I); 
    std::copy(y.begin(),y.end(),std::ostream_iterator <double>(
     std::cout,"\n")); 
} 

जो सही ढंग से

1.2 
4.5 
5.6 

रिटर्न बहरहाल, यह एक छोटे से अनाड़ी लगता है। क्या कोई बेहतर तरीका है?

उत्तर

6

आप बस std::transform का उपयोग करके इस लक्ष्य को हासिल कर सकते हैं:

int main() 
{ 
    std::vector<double> x { 1.2, 2.3, 3.4, 4.5, 5.6}; 
    std::set<unsigned int> I { 0, 3, 4}; 
    std::vector<double> y(I.size()); 

    std::transform(I.begin(), I.end(), y.begin(), 
    [&x](unsigned int i) { return x[i]; }); 

    std::copy(y.begin(),y.end(),std::ostream_iterator <double>(std::cout,"\n")); 
} 
4

तुम भी इस्तेमाल कर सकते हैं std::transform और std::back_inserter

template <typename T> 
std::vector <T> slice(
    std::vector<T> const &x, 
    std::set<unsigned int> const &I) 
{ 
    std::vector<double> result; 
    std::transform(I.begin(), I.end(), std::back_inserter(result), 
     [&x](unsigned int i) { return x[i]; }); 
    return result; 
} 
+1

मत भूलना 'std :: वेक्टर :: reserve'। – LogicStuff

2
template <typename T> 
std::vector <T> slice2(
    std::vector <T> const & x, 
    std::set <unsigned int> const & I 
    ) 
{ 
    auto z = std::vector <double>(); 
    std::for_each(I.begin(), I.end(), [&](const unsigned int &i) 
    { 
     z.push_back(x[i]); 
    }); 
    return z; 
} 
संबंधित मुद्दे