मुझे 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()
को लागू करने में मेरी मदद कर सकते हैं?
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_;
}
डालने के लिए आपको चाहिए।
- अतिरिक्त डेटा के लिए जगह बनाएं। (जैसा कि आपको push_back/emplace_back में भी करने की आवश्यकता है)।
- वर्तमान डेटा को सम्मिलन बिंदु से नए ऑफ़सेट में ले जाएं।
- सम्मिलित डेटा की प्रतिलिपि बनाएँ।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।