आप वास्तव में यह करने के लिए है, जबकि निर्माण चाहते हैं vector
आप constructor कि दो iterators लेता है का उपयोग करें और अपने स्वयं के कस्टम इटरेटर प्रदान कर सकता है। इटरेटर अपसंदर्भन एक वेक्टर आरक्षित इसे बनाने और फिर इसे वापस:
class VectorReserveItr : public std::iterator<std::input_iterator_tag, foo> {
size_t i;
size_t capacity;
public:
VectorReserveItr(size_t i, size_t capacity) : i(i), capacity(capacity) {}
VectorReserveItr& operator++() { ++i; return *this; }
bool operator!=(const VectorReserveItr& rhs) { return i != rhs.i; }
std::vector<foo> operator*() {
std::vector<foo> ret;
ret.reserve(capacity);
return ret;
}
};
std::vector<std::vector<foo>> v(VectorReserveItr(0, 1000), VectorReserveItr(100, 1000));
लेकिन मैं इसे एक पाश की तुलना में तेजी होने की उम्मीद नहीं होता और मुझे नहीं लगता कि यह या तो अधिक पठनीय है।
template<class F,
class T=std::result_of_t<F const&(std::size_t const&)>
>
struct countdown_iterator:
std::iterator<
std::input_iterator_tag,
T,
std::ptrdiff_t,
T*,
T
>
{
using self=countdown_iterator;
std::size_t count_down = 0;
F f;
T operator*() const {
return f(count_down);
}
self& operator++() {
--count_down;
return *this;
}
self operator++(int) {
auto result = *this;
++(*this);
return result;
}
friend bool operator==(self const& lhs, self const& rhs) {
return lhs.count_down == rhs.count_down;
}
friend bool operator!=(self const& lhs, self const& rhs) {
return !(lhs==rhs);
}
};
एक आधा assed रेंज वर्ग:
template<class It>
struct range {
It b, e;
It begin() const { return b; }
It end() const { return e; }
bool empty() const { return begin()==end(); }
decltype(auto) front() const { return *begin(); }
range():b(),e() {}
range(It s, It f):b(s), e(f) {}
range(range const&)=default;
range& operator=(range const&)=default;
~range() = default;
template<class C,
class=std::enable_if_t<!std::is_same<std::decay_t<C>, range>>
>
range(C&& c):
range(std::begin(std::forward<C>(c)), std::end(std::forward<C>(c)))
{}
};
template<class It>
range<It> make_range(It b, It e) { return {std::move(b),std::move(e)}; };
और फिर हम भरोसा कर सकते हैं:
template<class F,
class dF=std::decay_t<F>,
class It=countdown_iterator<dF>
class R=range<It>
>
R countdown(std::size_t N, F&& f) {
countdown_iterator e(N, f):
countdown_iterator b(N, std::forward<F>(f));
return {std::move(b),std::move(e)};
}
Live demo.
मैं इसे कैसे आप भीतरी वैक्टर पॉप्युलेट करने के लिए जा रहे हैं के बारे में ज्यादा निर्भर करता है लगता है। – LogicStuff
@LogicStuff क्या आप थोड़ा सा स्पष्टीकरण दे सकते हैं? –
"मैं बस निर्माण के बिना आरक्षित करना चाहता हूं क्योंकि फू दो बार निर्मित करने के लिए महंगा है।" - 'foo' को सीधे स्टोर न करें? शायद ['std :: unique_ptr'] (http://en.cppreference.com/w/cpp/memory/unique_ptr), या ['std :: प्रयोगात्मक :: वैकल्पिक '] (http: // en। cppreference.com/w/cpp/experimental/optional)। –
BoBTFish