N
तत्व v = (1, 2, 3, 4, ... , N)
के वेक्टर को K<N
आकार के सभी हिस्सों पर रिटर्न रेंज इटरेटर दिया गया है। K
से N%K!=0
की तुलना में अंतिम सीमा छोटी हो सकती है।कंटेनर को टुकड़ों में विभाजित करें, सी ++
उदाहरण के लिए:
v = ("a","b","c","d","e")
प्रदर्शन तार
"ab", "cd", "e"
N=v.size();
K=2;
एक संभव समाधान है:
for(unsigned int i=0; i<v.size(); i+=K)
cout << boost::join(v | boost::adaptors::sliced(i, min(i+K, v.size())), "");
यह समाधान काफी ठीक है, लेकिन यह कई समस्याएं हैं:
for
पाश - क्या इसकी आवश्यकता है?- यदि आप
min(i+K, v.size())
एल्गोरिदम क्रश के बजाय लिखते हैं, तो किसी को सीमा के मामले पर अतिरिक्त ध्यान देना होगा। यह बदसूरत और परेशान दिखता है।
क्या आप अधिक सुरुचिपूर्ण समाधान का प्रस्ताव दे सकते हैं? सुरुचिपूर्ण समाधान से मेरा मतलब है कि सामान्य एल्गोरिदम का उपयोग, आमतौर पर उपयोग की जाने वाली लाइब्रेरी (जैसे बूस्ट) द्वारा निर्मित या प्रदान किया जाता है।
-------------------------- [संपादित करें] ----------------- ---------
आप में से कुछ ने काम करने का उदाहरण दिया, यहां यह है।
#include <iostream>
#include <vector>
#include <string>
#include <boost/range/adaptor/sliced.hpp>
#include <boost/algorithm/string/join.hpp>
#include <boost/assign.hpp> //just for fun
using namespace std;
using namespace boost::assign;
int main(int , char **)
{
const int K = 2;
vector<string> v;
v += "a","b","c","d","e";
for(unsigned int i=0; i<v.size(); i+=K)
cout << boost::algorithm::join(
v | boost::adaptors::sliced(i, min(i+K, v.size())), "")
<< endl;
}
आउटपुट:
template <class T, class Func>
void do_chunks(T container, size_t K, Func func) {
size_t size = container.size();
size_t i = 0;
// do we have more than one chunk?
if (size > K) {
// handle all but the last chunk
for (; i < size - K; i += K) {
func(container, i, i + K);
}
}
// if we still have a part of a chunk left, handle it
if (i % K) {
func(container, i, i + i % K);
}
}
आप पूर्ण उदाहरण क्यों नहीं पोस्ट करते? उदाहरण के लिए –
@VJovic मैंने दिखाया कि मुझे वास्तव में क्या चाहिए लेकिन यह एक सामान्य प्रश्न है, एक कंटेनर के प्रत्येक हिस्से पर अलग-अलग एल्गोरिदम कैसे चलाएं। – bartek
दुर्भाग्यवश, मैं आपके उदाहरण को संकलित नहीं कर सकता, और मैंने अपनी क्रिस्टल बॉल खो दी;) –