對于作業,我們必須創建自定義串列類。其中一個功能是將一個元素插入到串列的中間。到目前為止,我有,
template<class T>
class MyList : public list<T> {
public:
void addInMiddle(const T&);
void insertInSortedOrder(const T&);
void printList();
};
template<class T>
void MyList<T>::addInMiddle(const T& x) {
list<T>::iterator it = this->begin();
int location = (this->size()) / 2; //where we want to insert the new element
for (int i = 0; i < location; i ) {
it ;
}
this->insert(it,x);
}
int main()
{
MyList<int> list1;
list1.push_back(1);
list1.push_back(2);
list1.push_back(3);
list1.push_back(4);
list1.addInMiddle(5);
list1.printList();
return 0;
}
程式編譯并顯示 1,2,3,4。它實際上應該顯示 1,2,5,3,4。我不認為迭代器正在作業。有什么想法嗎?
uj5u.com熱心網友回復:
一旦我typename在前面添加,您的代碼就可以正常作業list<T>::iterator,因為迭代器的型別取決于T模板引數的型別,例如:
typename list<T>::iterator it = this->begin();
在線演示
請參閱在哪里以及為什么必須放置“模板”和“型別名稱”關鍵字?
或者,您可以(并且應該)只使用auto:
auto it = this->begin();
在線演示
話雖如此,標準 C 容器并不打算從(無虛擬解構式等)繼承。您應該使用封裝而不是繼承,例如:
template<class T>
class MyList {
private:
list<T> m_list;
public:
void addToBack(const T&);
void addInMiddle(const T&);
void insertInSortedOrder(const T&);
void printList();
};
template<class T>
void MyList<T>::addToBack(const T& x) {
m_list.push_back(x);
}
template<class T>
void MyList<T>::addInMiddle(const T& x) {
list<T>::iterator it = m_list.begin();
// or: auto it = m_list.begin();
int location = m_list.size() / 2; //where we want to insert the new element
for (int i = 0; i < location; i ) {
it ;
}
m_list.insert(it, x);
}
int main()
{
MyList<int> list1;
list1.addToBack(1);
list1.addToBack(2);
list1.addToBack(3);
list1.addToBack(4);
list1.addInMiddle(5);
list1.printList();
return 0;
}
在線演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/436768.html
