मुझे operator[], 5 के नियम, push_back, और insert के साथ एक वेक्टर वर्ग लागू करना है।

template<class T>
class MyVector
{
private:
    int size_;
    int capacity_;
    T* data;
public:
    typedef T* it;

    it begin();
    it end();
    void push_back(const T& value);

मैंने कंस्ट्रक्टर, कॉपी कंस्ट्रक्टर, मूव कंस्ट्रक्टर, कॉपी असाइनमेंट ऑपरेटर, मूव असाइनमेंट ऑपरेटर बनाना शुरू किया।

मैंने begin() और end() को इस तरह लागू किया:

template<class T>
typename MyVector<T>::it MyVector<T>::begin()
{
    return data;
}

template<class T>
typename MyVector<T>::it MyVector<T>::end()
{
    return data + size();
}

मुझे नहीं पता कि push_back() और insert() को कैसे लागू किया जाए।

push_back() के लिए, मैंने कुछ इस तरह सोचा:

void push_back(const T & v)
{
    if (size_ < capacity_)
        data [size_++] = v;
}

लेकिन insert() के लिए, मुझे कोई जानकारी नहीं है।

क्या आप कृपया insert() को लागू करने में मेरी मदद कर सकते हैं?

0
Ac1234 15 सितंबर 2020, 20:39

2 जवाब

सबसे बढ़िया उत्तर

आपका push_back() सही ढंग से क्रियान्वित नहीं किया गया है। जब size_ capacity_ के बराबर होता है, तो नए मान को धक्का देने के लिए जगह बनाने के लिए इसे सरणी को विकसित करने की आवश्यकता होती है।

इसी तरह, आपके insert() को भी जरूरत पड़ने पर ऐरे को बढ़ाना होगा। इसके बाद यह उस इंडेक्स का पता लगा सकता है जहां नया मान जाना चाहिए, सभी तत्वों को बाद उस इंडेक्स को सरणी में एक स्लॉट में स्थानांतरित करें, और फिर उस इंडेक्स पर तत्व को नया मान असाइन करें।

कुछ इस तरह का प्रयास करें:

template<class T>
void MyVector<T>::grow()
{
    static const int delta = ...; // <-- use whatever value makes sense for your use case...
    int new_cap = capacity_ + delta;
    T* new_data = new T[new_cap];
    for(int i = 0; i < size_; ++i) {
        new_data[i] = std::move(data[i]);
    }
    delete[] data;
    data = new_data;
    capacity_ = new_cap;
}

template<class T>
void MyVector<T>::push_back(const T & v)
{
    if (size_ == capacity_)
        grow();

    data[size_] = v;
    ++size_;
}

template<class T>
void MyVector<T>::insert(typename MyVector<T>::it pos, const T & v)
{
    int index = pos - data;
    if (index < 0 || index > size_)
        return; // or throw...

    if (size_ == capacity_)
        grow();

    for(int i = size_ - 1; i >= index; --i)
        data[i+1] = data[i];

    data[index] = v;
    ++size_;
}

लाइव डेमो

2
Remy Lebeau 15 सितंबर 2020, 21:35

डालने के लिए आपको चाहिए।

  • अतिरिक्त डेटा के लिए जगह बनाएं। (जैसा कि आपको push_back/emplace_back में भी करने की आवश्यकता है)।
  • वर्तमान डेटा को सम्मिलन बिंदु से नए ऑफ़सेट में ले जाएं।
  • सम्मिलित डेटा की प्रतिलिपि बनाएँ।
0
Surt 15 सितंबर 2020, 20:46