C++标准库双向链表 list 中的insert函数实现。

news2024/11/14 2:14:50

 C++Primer中文版(第五版):

   //运行时错误:迭代器表示要拷贝的范围,不能指向与目的位置相同的容器
    slist.insert(slist.begin(),slist.begin(),slist.end());
    
如果我们传递给insert一对迭代器,它们不能指向添加元素的目标容器。
       在新标准下,接受元素个数范围的insert版本返回指向第一个新加入元素的迭代
    
器。(在旧版本的标准库存中,这些操作返回void。)如果范围为空,不插入任何元素,insert
操作会将第一个参数返回。
 

例子1:

int main() {

	list<string> sl1 = { "1","2","3" };

	_DList<string> sl2 = { "1","2","3" };

	vector<string> v = { "quasi", "simba","frollo","scar" };

	//将v的最后两个元素添加到list的开始位置
	sl1.insert(sl1.begin(), v.end() - 2, v.end());
	sl2.std_insert(sl2.begin(), v.end() - 2, v.end());
	 

	_pn(sl1);
	_pn(sl2);

	cout << "----------------------------------------------------------\n";


	//添加一列表
	sl1.insert(sl1.end(), { "4","5","6","7","中文","8","9" });
	sl2.std_insert(sl2.end(), { "4","5","6","7","中文","8","9" }); 
	_pn(sl1);
	_pn(sl2);


	cout << "----------------------------------------------------------\n";

	//复制自己(旧版会运行时错误,迭代器表示要拷贝的范围,不能指向与目的位置相同的容器)
	sl1.insert(sl1.begin(), sl1.begin(), sl1.end());
	sl2.std_insert(sl2.begin(), sl2.begin(), sl2.end());

	_pn(sl1);
	_pn(sl2);

}

结果:

例子2:

 
int main() {

	_DList<string> lst1;
	list<string> lst2;

	string word;

	auto iter1 = lst1.begin();
	auto iter2 = lst2.begin();

	while (cin >> word) {
		iter1 = lst1.std_insert(iter1, word); //等价于调用push_front
		_pn(lst1);

		iter2 = lst2.insert(iter2, word); //等价于调用push_front
		_pn(lst2);
	}
}

结果:

_DList中的实现:

主要函数:

 /// <summary>
 /// 在_Where位置前插入[itBegin,itEnd)(用法与std::list::insert要一样)
 /// 注意:std旧重版itBegin和itEnd不能指向与目的位置相同的容器,在新标准版可以。
 /// </summary>
 /// <typeparam name="IteratorClass"></typeparam>
 /// <param name="_Where"></param>
 /// <param name="itBegin"></param>
 /// <param name="itEnd"></param>
 /// 创建时间: 2024-09-22      最后一次修改时间:2024-09-22 (已测试)
 template<class IteratorClass>
 inline _DListNodeIterator<T> std_insert(const _DListNodeIterator<T>& _Where, const IteratorClass& itBegin,
     const IteratorClass& itEnd) {

     /*
         list slist;      
         //运行时错误:迭代器表示要拷贝的范围,不能指向与目的位置相同的容器
         slist.insert(slist.begin(),slist.begin(),slist.end());
    
     */

     if (typeid(_DListNodeIterator<T>) == typeid(IteratorClass)) {

         _DListNodeIterator<T>* pbegin = (_DListNodeIterator<T>*)(&itBegin);
         _DListNodeIterator<T>* pend = (_DListNodeIterator<T>*)(&itEnd);

         //lassert(_Where._pCurrentList != p->_pCurrentList,"不能插入指向相同容器的元素");
         if (_Where._pCurrentList == pbegin->_pCurrentList) {

             //创建一个临时链表,会影响性能
             _DList<T> tmp(*pbegin,*pend);
             return std_insert(_Where, tmp.begin(), tmp.end());
         }            
     }     

     IteratorClass tmp = itBegin;

     _DListNode<T>* pReulst = null;

     if (_Where._Ptr == null) {

         while (tmp != itEnd) {

             if (pReulst == null) {
                 //保存第一次插入的结点,以便返回
                 pReulst = this->inseart_back(_Last, *tmp);
             }
             else
                 this->inseart_back(_Last, *tmp);
             ++tmp;
         }

     }
     else {

         auto ptr = _Where._Ptr;

         while (tmp != itEnd) {
             if (pReulst == null) //第一次,在前面插入第一项
             {
                 ptr = this->inseart_front(ptr, *tmp);
                 //保存第一次插入的结点,以便返回

                 pReulst = ptr;
             }
             else { //第二次开始,在插入的第一项后面依次插入
                 ptr = this->inseart_back(ptr, *tmp);
             }

             ++tmp;
         }
     }

     return _DListNodeIterator<T>(pReulst, this);
 }

 _DList类,有修改:

/*******************************************************************************************
文件名			: _List.h

作者				: 李锋

功能				: 链表

手机				: 13828778863

Email			:  ruizhilf@139.com


创建时间			: 2016年07月31日

最后一次修改时间	:  2024年07月30日


/// 链表是一种用来存储数据集合的数据结构。链表具有如下属性
///(1)元素通过指针依次相连
///(2)最后一个元素的指针为空(null)。
///(3)在程序的执行过程中,链表的长度可以自由伸缩。
///(4)链表的长度可以要求的任意长度(除非系统内存耗尽)。
///(5)它不会浪费内存空间(但会需要额外的内存空间存储指针)。


记住: Virtual C++  Bug:   模板继承用到父类成员访问时,要用 this->

********************************************************************************************/
#ifndef  __LIST_H_
#define  __LIST_H_

#include "_Macro.h"
#include "_Memory.h"
#include "_ByteArray.h" 
#include "_Pair.h"
#include "_IteratorBase.h"


_LF_BEGIN_

template<class T> class _DList; //前置声明

/// <summary>
/// 排序顺序
/// </summary>
enum class _SortOrder
{
    s_Minmax = 0,   //从小到大   
    s_Maxmin = 1,   //从大到小
    s_null = 2       //无排序顺序
};

 

/// <summary>
/// 单链表节点
/// </summary>
/// <typeparam name="T"></typeparam>
/// 创建时间	 2021年10月23日   最后一次修改时间	:  2021年10月23日
template<class T>
class _SListNode
{

public:
    /// <summary>
    /// 节点数据
    /// </summary>
    T Data;

    /// <summary>
    /// 下一个节点
    /// </summary>
    _SListNode<T>* Next;


    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="aData"></param>
    _SListNode(T aData)
    {
        Data = aData;

    }

};




/// <summary>
///  C#语句:public class _DListNode<T>
/// </summary>
/// <typeparam name="T">默认数据</typeparam>
template<class T>
class _DListNode   
{
public:
    /// <summary>
    /// 节点数据
    /// </summary>
    T Data;


    /// <summary>
    /// 前一个节点
    /// </summary>
    _DListNode<T>* Prev;

    /// <summary>
    /// 下一个节点
    /// </summary>
    _DListNode<T>* Next;


    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="aData">默认数据</param>
    _DListNode(const T& aData)
    {
        Data = aData;
        Prev = null;
        Next = null;
    }

    _DListNode()
    {
        Prev = null;
        Next = null;
        Data = T();
    }
};



 
/// <summary>
/// 单链表:
///     通常我们说的链表指的是单链表(singly linked list)。单链表包括一组结点,每个结
/// 点有一个 next 指针域,用来存储指向(逻辑上)下一个元素对应结点的指针。最后一个结点的
/// next指针域的值为null,这预示着已经到达链表的尾部。
/// 
/// </summary>
/// <typeparam name="T"></typeparam>
template<class T>
class _SList  : public _Object
{
private:
    /// <summary>
    /// 第一个结点
    /// </summary>
    _SListNode<T>* _First;


    /// <summary>
    /// 结点数
    /// </summary>
    int _Count;


public:
    inline const int& Count() { return _Count; }

    inline const _SListNode<T>* First() { return _First; }


};





//------------------------------------------LDIterator
//参考网址:  https://blog.csdn.net/qq_28398301/article/details/106321525          C++用for遍历自定义类


/// <summary>
/// 
/// </summary>
/// <typeparam name="T"></typeparam>
template<class T>
class _DListNodeIterator  
{
public:
    using value_type = T;
public:
    /// <summary>
    /// 当前节点
    /// </summary>
    _DListNode<T>* _Ptr;   //命名与标库相同  _pCurrentNode;

    /// <summary>
    /// 当前链表
    /// </summary>
    const _DList<T>*  _pCurrentList;

    inline _DListNodeIterator()
    { 
        _pCurrentList = null;
        _Ptr = null;
    }


    inline _DListNodeIterator(const _DList<T>* pCurrentList)
    {
        assert(pCurrentList != null);
        _pCurrentList = (_DList<T>*)pCurrentList;
        _Ptr = null;
    }

    /// <summary>
    /// 构造函数,传值迭代器管理的值
    /// </summary>
    /// <param name="pNode"></param>
    inline _DListNodeIterator(const _DListNode<T>* pCurrentNode, const  _DList<T>* pCurrentList)
    {
        _Ptr = (_DListNode<T>*)pCurrentNode;
        _pCurrentList = (_DList<T>*)pCurrentList;
    }
     
    inline _DListNodeIterator(const _DListNodeIterator& it)   
    {
        _Ptr = it._Ptr;
        _pCurrentList = it._pCurrentList;
    }

    /*
    /// <summary>
    /// 比较实现
    /// </summary>
    /// <param name="that"></param>
    /// <returns></returns>
    bool operator != (const _DListNodeIterator& that) { return _pNode != that._pNode; }


    bool operator > (const _DListNodeIterator& right) { return _pNode->Data > right._pNode->Data; }

    bool operator < (const _DListNodeIterator& right) { return _pNode->Data < right._pNode->Data; }

    /// <summary>
    /// 自增实现
    /// </summary>
    /// <returns></returns>
    inline _DListNodeIterator& operator ++ () { _pNode = _pNode->Next;   return *this; }


    /// <summary>
    /// lf::_DList<int> d = { 1,3,5,8,2 };
    /// auto it1 = d.begin();  
    /// cout << *it1 << "\n";        // 输出:1
    /// cout << *(it1 + 2) << "\n";  // 输出:5
    /// </summary>
    /// <param name="nDiff"></param>
    /// <returns></returns>
    /// 创建时间: 2024-07-01     最后一修改时间:2024-07-01
    inline _DListNodeIterator operator+(const size_t nDiff) {

        _DListNodeIterator result(_pNode);   

        for (int n = 0; n < nDiff; ++n)
        {
            result._pNode = result._pNode->Next;
        }
        return result;
    }

 

    /// <summary>
    /// 解引用,取值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    T& operator * () { return _pNode->Data; }


    //LDIterator(const LDIterator&) = delete;
    //LDIterator& operator=(const LDIterator&) = delete;
    //~LDIterator() = default;
    */
 
public: //----------------------------重写 
    /// <summary>
    /// 解引用,取值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-03
    inline T& operator * () const { return _Ptr->Data; }


    /// <summary>
    /// 向前移动为正,向后移动为负
    /// </summary>
    /// <param name="iDiff"></param>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline virtual void Move(const int& iDiff) 
    {
        if (iDiff == 0) return;
        
        if (iDiff > 0){
            
            if (_Ptr == null) //已经是最后了,不能向后移了
            { 
                return;
            }
               
            int n = 0;

           
            while (true){

                _Ptr = _Ptr->Next;
                ++n;
                if (n == iDiff){  return; }
            }
        }else{
            int n = 0;
            if (_Ptr == null) {//向前移,减-1进入未尾元素
                _Ptr = _pCurrentList->Last();
                n = -1;  //已经向前移了一位

                if (n == iDiff) { return; }
            }

            while (true){
                _Ptr = _Ptr->Prev;
                --n;

                if (n == iDiff){ return; }
            }
        }

        throw "未重写代码?";
    }

     
    /// <summary>
    /// 
    /// </summary>
    /// <param name="right"></param>
    /// <returns></returns>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeIterator operator+(const int& iDiff)const {
        _DListNodeIterator itResult(*this);
        itResult.Move(iDiff);
        return itResult;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="right"></param>
    /// <returns></returns>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeIterator operator-(const int& iDiff)const {
        _DListNodeIterator itResult(*this);
        itResult.Move(-iDiff);
        return itResult;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="r"></param>
    /// <returns></returns>
    /// 创建时间:2024-07-03    最后一次修改时间:2024-07-25
    inline int operator-(const _DListNodeIterator& r)const {

        int n1 = _pCurrentList->FindNodeIndex(_Ptr);
        int n2 = _pCurrentList->FindNodeIndex(r._Ptr);

        //assert(n1 != -1 && n2 != -1);

        //确保 _pCurrentList->end() - _pCurrentList->begin() == _pCurrentList->Count
        //超过边界,指针都设为指向最后一位元素的下一位
        if (n1 == -1)  n1 = _pCurrentList->Count;
        if (n2 == -1)  n2 = _pCurrentList->Count;
 
        return n1 - n2; 
    }

    /// <summary>
    /// 前置加加
    /// </summary>
    /// <returns></returns>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeIterator& operator++() { Move(1); return  *this; }


    /// <summary>
    /// 前置减减
    /// </summary>
    /// <returns></returns>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeIterator& operator--() { Move(-1); return  *this; }


    /// <summary>
    /// 后置加加
    /// </summary>
    /// <param name=""></param>
    /// <returns></returns>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeIterator operator++(int) {
        _DListNodeIterator sResult(*this);
        Move(1);
        return sResult;
    }

    /// <summary>
    /// 后置减减
    /// </summary>
    /// <param name=""></param>
    /// <returns></returns>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeIterator operator--(int) {
        _DListNodeIterator sResult(*this);
        Move(-1);
        return sResult;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="r"></param>
    /// <returns></returns>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeIterator& operator+=(const int& iDiff) {
        Move(iDiff);
        return *this;
    }


    /// <summary>
    /// 
    /// </summary>
    /// <param name="r"></param>
    /// <returns></returns>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeIterator& operator-=(const int& iDiff) {
        Move(iDiff);
        return *this;
    }


    /// <summary>
    ///  关联代码:
    ///  _DList<int> d = { 1,3,53,55,35,97,35,10 };
    ///  d.end() - d.begin(); //8
    /// </summary>
    /// <param name="r"></param>
    /// <returns></returns>
    /// 创建时间:2024-07-03    最后一次修改时间:2024-07-03
    inline int operator-(const _DListNodeIterator& r)
    {
        //note1 到最未尾的索引
        //note2 到最未尾的索引

        int i1 = 0, i2 = 0;

        auto pNode1 = _Ptr;
        auto pNode2 = r._Ptr;


        //pNote1到结点未尾的距离
        while (pNode1 != null)
        {
            pNode1 = pNode1->Next;
            ++i1;
        }

        //pNote2到结点未尾的距离
        while (pNode2 != null)
        {
            pNode2 = pNode2->Next;
            ++i2;
        }

        // - (i1-i2)  值越小,离结点未越近,例如 null 结点,就是 0。
        return  i2 - i1;
    }


    //-------------------------------如果是非线性表,下面的运算符重载也要重写


    inline bool operator!=(const _DListNodeIterator& r) { return this->_Ptr != r._Ptr; }

    inline bool operator==(const _DListNodeIterator& r) { return this->_Ptr == r._Ptr; }

    inline bool operator>(const _DListNodeIterator& r) { return this->_Ptr > r._Ptr; }

    inline bool operator<(const _DListNodeIterator& r) { return this->_Ptr < r._Ptr; }
};



/// <summary>
/// 
/// </summary>
/// <typeparam name="T"></typeparam>
/// 创建时间: 2024-07-03     最后一修改时间:2024-07-03
template<class T>
class _DListNodeReverseIterator
{
public:
    using value_type = T;

private:
    /// <summary>
    /// 当前节点
    /// </summary>
    _DListNode<T>* _pCurrentNode;

    /// <summary>
    /// 当前链表
    /// </summary>
    _DList<T>* _pCurrentList;
public:

    inline _DListNodeReverseIterator()
    {
        _pCurrentList = null;
        _pCurrentNode = null;
    }


    inline _DListNodeReverseIterator(const _DList<T>* pCurrentList)
    {
        assert(pCurrentList != null);
        _pCurrentList = (_DList<T>*)pCurrentList;
        _pCurrentNode = null; 
    }

    /// <summary>
    /// 构造函数,传值迭代器管理的值
    /// </summary>
    /// <param name="pNode"></param>
    inline _DListNodeReverseIterator(const _DListNode<T>* pCurrentNode, const _DList<T>* pCurrentList)
    {
        _pCurrentNode = (_DListNode<T>*)pCurrentNode;
        _pCurrentList = (_DList<T>*)pCurrentList;
    }

    inline _DListNodeReverseIterator(const _DListNodeReverseIterator& it)
    {
        _pCurrentNode = it._pCurrentNode;
        _pCurrentList = it._pCurrentList;
    }

    /// <summary>
    /// 解引用,取值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-03
    inline T& operator * ()const { return _pCurrentNode->Data; }

    /// <summary>
    /// 前置加加
    /// </summary>
    /// <returns></returns>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeReverseIterator& operator++() { Move(1); return  *this; }

    /// <summary>
   /// 前置减减
   /// </summary>
   /// <returns></returns>
   /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeReverseIterator& operator--() { Move(-1); return  *this; }


    /// <summary>
    /// 后置加加
    /// </summary>
    /// <param name=""></param>
    /// <returns></returns>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeReverseIterator operator++(int) {
        _DListNodeIterator sResult(*this);
        Move(1);
        return sResult;
    }

    /// <summary>
    /// 后置减减
    /// </summary>
    /// <param name=""></param>
    /// <returns></returns>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline _DListNodeReverseIterator operator--(int) {
        _DListNodeIterator sResult(*this);
        Move(-1);
        return sResult;
    }


    /// <summary>
    /// 向后移动为正,向前移动为负
    /// </summary>
    /// <param name="iDiff"></param>
    /// 创建时间:2024-07-02    最后一次修改时间:2024-07-02
    inline void Move(const int& iDiff) 
    {
        assert(_pCurrentList != null);

        if (iDiff == 0) return;

        if (iDiff > 0) {  //向后移动
            int n = 0;

            if (_pCurrentNode == null) {  //不能向前移动
                _pCurrentNode = _pCurrentList->Last();
                n = 1;  //已经向后移动了一位 
                if (n == iDiff) { return; }
            }
            while (true) {

                _pCurrentNode = _pCurrentNode->Prev;
                ++n;

                if (n == iDiff) { return; }
            }
        }
        else {

            if (_pCurrentNode == null) {  //不能向后移动
                return;
            }


            int n = 0;
            while (true) {
                _pCurrentNode = _pCurrentNode->Next;
                --n;

                if (n == iDiff) { return;}
            }
        }

        throw "未重写代码?";
    }

    inline bool operator!=(const _DListNodeReverseIterator& r) { return this->_pCurrentNode != r._pCurrentNode; }
     

    inline bool operator==(const _DListNodeReverseIterator& r) { return this->_pCurrentNode == r._pCurrentNode; }

    inline bool operator>(const _DListNodeReverseIterator& r) { return this->_pCurrentNode > r._pCurrentNode; }

    inline bool operator<(const _DListNodeReverseIterator& r) { return this->_pCurrentNode < r._pCurrentNode; }
};


/// <summary>
/// 双向链表,  数据 T 要求能够比较大小,否则编译会出错。
/// </summary>
/// <typeparam name="T"></typeparam>
template<class T>
class _DList : public _Object
{
public:
    using value_type = T;
    using iterator = _DListNodeIterator<T>;

    static const size_t  npos = -1;      //不可能的索引  
protected:
    _DListNode<T>*  _First;	        //第一个节点
    _DListNode<T>*  _Last;		    //最后一个节点
    size_t          _Count;			//节点个数
    size_t          _MaxBuffer;     //双链表最大可以存储的元素个数
    _SortOrder      _so;            //排序顺序
protected:

    /// <summary>
    /// 初台化数据
    /// </summary>
    /// <returns></returns>
    inline void InitData() 
    {
        _Count = 0; _First = null; _Last = null; _MaxBuffer = 100000;
        _so = _SortOrder::s_null;
    }


public: //---------------------------------------------------------------------------属性

    __declspec(property(get = GetSortOrder, put = SetSortOrder) )  _SortOrder SortOrder;
    const _SortOrder& GetSortOrder() const { return _so; }
    virtual void SetSortOrder(const _SortOrder so) { _so = so; }



    __declspec(property(get = GetCount)) const int Count;


    /// <summary>
    /// 为了兼容标准库。
    /// 例:T = vector, string, _DList....
    /// size_t nSize = T.size();
    /// auto itBegin = T.begin();
    /// </summary>
    /// <returns></returns>
    /// 创建时间: 2024-07-30     最后一修改时间:2024-07-30
    int size()const { return _Count; }


    inline int GetCount() const { return _Count; }


public:

    //------------------------------------------------------------构造与析构
    
    /// <summary>
    /// 默认构造函数
    /// </summary>
    /// <returns></returns>
    inline _DList()
    {
        InitData();
    }

    /// <summary>
    /// 拷贝[itBegin,itEnd)
    /// </summary>
    /// <param name="itBegin"></param>
    /// <param name="itEnd"></param>
    /// 创建时间: 2024-09-23     最后一修改时间:2024-09-23
    inline _DList(const _DListNodeIterator<T>& itBegin, const _DListNodeIterator<T>& itEnd) {

        InitData();

        _DListNodeIterator<T> it = itBegin;

        while (it != itEnd) {          
            Add(*it);
            ++it;
        }
    }

    inline _DList(const _DList& dl)
    {
        //_cout << _t("inline _DList<T>::_DList(const _DList& dl)\n");

        InitData();

        _DListNode<T>* dn = dl.First();

        while (dn != null)
        {
            Add(dn->Data);

            dn = dn->Next;
        }
    }

    inline _DList(const std::vector<T>& v) {
        InitData();
        for (const T& t : v)
        {
            Add(t);
        }
    }



    inline _DList(const T& item) 
    {

        InitData();

        Add(item);
    }

    /// <summary>
    /// 列表初始化  dList<int> idl = {1,2,3,4};
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="tList"></param>
    inline _DList(std::initializer_list<T> tList)
    {
        InitData();
        for (T t : tList) { Add(t); }
    }
     

    /// <summary>
    /// 析构函数
    /// </summary>
    inline virtual ~_DList()
    {
        //_cout << _t("inline _DList<T>::~_DList()\n");
        ClearData();
    }


    //------------------------------------------------------------属性

 
    /// <summary>
    /// 双链表最大可以存储的元素个数
    /// </summary>
    int MaxBuffer()const { return _MaxBuffer; }

    /// <summary>
    ///设定双链表最大可以存储的元素个数
    /// </summary>
    /// <param name="nCaptionty"></param>
    inline void MaxBuffer(const size_t  &nCaptionty) { _MaxBuffer = nCaptionty; }


    inline size_t csharp_Count() const { return _Count; }

    inline _DListNode<T>* First()const { return _First; }

    inline _DListNode<T>* Last()const { return _Last; }

    inline _DListNodeIterator<T> begin()const { return _DListNodeIterator<T>(_First,this); }

    inline _DListNodeReverseIterator<T> rbegin()const { return _DListNodeReverseIterator<T>(_Last,this); }

    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    inline _DListNodeIterator<T> end()const
    {
        //迭代器使用的语句
        //for (_DListNodeIterator<int> f = dl.begin(); f != dl.end(); f++) {       }


        return _DListNodeIterator<T>(null,this);
    }

    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    inline _DListNodeReverseIterator<T> rend()const
    {
        //迭代器使用的语句
        //for (_DListNodeIterator<int> f = dl.begin(); f != dl.end(); f++) {       }


        return _DListNodeReverseIterator<T>(null, this);
    }

    //-----------------------------------------------------------运算符重载

    /// <summary>
    /// 重载的下标操作符 []
    /// </summary>
    T& operator[](const size_t& nIndex) const {  return IndexOfNode(nIndex)->Data; }


    /// <summary>
    /// 重载的下标操作符 =
    /// </summary>
    /// 创建时间: ????-??-??      最后一次修改时间:2024-04-19     
    inline _DList<T>& operator = (const _DList<T>& other)
    {
        if (this != &other)
        {
            ClearData();
            Add(other);              
        }

        return *this;
    }

    
    /// <summary>
    /// 类型转换
    /// </summary>
    inline operator _string() const{ return ToString(); }

    /// <summary>
    /// 类型转换
    /// </summary>
    inline operator _stdstr() const { return ToString().Data; }


 
    //---------------------------------------------------------虚函数重写


    /// <summary>
    /// 是否存在 item
    /// </summary>
    inline virtual bool Contains(const T& item){ return BinarySearch(item) != -1; }


    /// <summary>
    /// 交换两个节点的数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="iIndex1"></param>
    /// <param name="iIndex2"></param>
    /// <returns></returns>
    /// 创建时间: ???-??-??      最后一次修改时间:2024-09-20 (改用_Math::swap)    
    inline bool SwapNodeData(const int& iIndex1, const int& iIndex2)
    {
        _DListNode<T>* pNode1, * pNode2;

        pNode1 = IndexOfNode(iIndex1);
        pNode2 = IndexOfNode(iIndex2);

        if (!(pNode1 != null && pNode2 != null))
        {
            return false;
        }

      
        /*
        T ptmp = pNode1->Data;
        pNode1->Data = pNode2->Data;
        pNode2->Data = ptmp;
        */

        _Math::swap(pNode1->Data, pNode2->Data);

        return true;
    }

    /// <summary>
    /// 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小
    /// 或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序
    /// 的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="sortord"></param>
    /// 创建时间: ???-??-??      最后一次修改时间:2024-09-20 (改用_Math::swap)   已测试
    inline virtual void Sort_Selection(const _SortOrder& sortord = _SortOrder::s_Minmax)
    {
        if (_Count == 0 || _Count == 1) return;


        _DListNode<T>* min = _First, * tmp = _First->Next;

        if (sortord == _SortOrder::s_Minmax) //从小到大
        {
            while (min->Next != null)
            {
                while (tmp != null)
                {
                    if (tmp->Data < min->Data)  //交换数据
                    {
                        /*
                        T pt = tmp->Data;
                        tmp->Data = min->Data;
                        min->Data = pt;
                        */
                        _Math::swap(tmp->Data, min->Data);
                    }
                    tmp = tmp->Next;
                }
                min = min->Next;
                tmp = min->Next;
            }
        }
        else
        {
            while (min->Next != null)
            {
                while (tmp != null)
                {
                    if (tmp->Data > min->Data)
                    {
                        /*
                        T pt = tmp->Data;
                        tmp->Data = min->Data;
                        min->Data = pt;
                         */
                        _Math::swap(tmp->Data, min->Data);
                    }
                    tmp = tmp->Next;
                }
                min = min->Next;
                tmp = min->Next;
            }
        }

        this->_so = sortord;  //已排序
    }

    /// <summary>
    /// 返回索引的节点
    /// </summary>
    inline virtual _DListNode<T>* IndexOfNode(const size_t& nPos)const
    {
        if (nPos >= _Count) //错误索引:
        {
            return NULL;
        }

        size_t nindex = 0;

        if (nPos > _Count / 2)
        {
            _DListNode<T>* pNode = _Last;
            while (pNode != null)
            {
                if (nindex++ == _Count - nPos - 1) { return pNode; }
                pNode = pNode->Prev;
            }
        }
        else
        {
            _DListNode<T>* pNode = _First;
            while (pNode != null)
            {
                if (nindex++ == nPos)
                {
                    return pNode;
                }
                pNode = pNode->Next;
            }
        }
        return null;
    }


    /// <summary>
    /// 把节点移到最后
    /// </summary>
    /// <param name="dnCurrent"></param>
    /// <returns></returns>
    /// 创建时间: 2022-02-18      最后一次修改时间:2024-09-23
    inline virtual _DListNode<T>* MoveLast(_DListNode<T>* pNode)
    {
        if (pNode != null) {

            if (pNode == _Last) {

                //ok

            }else if (pNode == _First) {  //此时最少两个节点

                _First = _First->Next;
                _First->Prev = null;

                _Last->Next = pNode;
                pNode->Prev = _Last;

                _Last = pNode;

                this->_so = _SortOrder::s_null;

            }else {

                pNode->Prev->Next = pNode->Next;
                pNode->Next->Prev = pNode->Prev;

                _Last->Next = pNode;
                pNode->Prev = _Last;
                _Last = pNode;

                this->_so = _SortOrder::s_null;
            }
        }

        return pNode;        
    }

    /// <summary>
    /// 把索引为nIndex的节点移到最后,并返回这个节点。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="iIndex"></param>
    /// <returns></returns>
    /// 创建时间: ???-??-??      最后一次修改时间:2024-09-22  
    inline virtual  _DListNode<T>* MoveLast(const size_t& nIndex)
    {
        return MoveLast(IndexOfNode(nIndex));
    }




    /// <summary>
    /// 把索引为nIndex的节点移到最前
    /// </summary>
    /// <param name="iIndex"></param>
    inline virtual bool MoveFirst(const size_t& nIndex)
    {
        _DListNode<T>* pNode = IndexOfNode(nIndex);

        if (pNode != null)
        {
            if (pNode == _First)
                return true;

            if (pNode == _Last)  //此时最少两个节点
            {
                _Last->Prev->Next = null;
                _Last = _Last->Prev;

                pNode->Prev = null;
                pNode->Next = _First;

                _First->Prev = pNode;

                _First = pNode;

            }
            else
            {
                pNode->Prev->Next = pNode->Next;
                pNode->Next->Prev = pNode->Prev;


                pNode->Next = _First;
                _First->Prev = pNode;
                pNode->Prev = null;

                _First = pNode;

            }

            return true;
        }

        return false;
    }


    /// <summary>
    /// 将指定集合的元素添加到末尾
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="item"></param>
    /// <returns></returns>
    /// 创建时间: ????-??-??      最后一次修改时间:2024-09-22
    inline virtual _DListNode<T>* Add(const T& tValue)
    {
        _DListNode<T>* pResult;

        if (_Count == 0)
        {
            //_First = new _DListNode<T>(item);
            pResult = _Memory::New< _DListNode<T> >(1);

            _First = pResult;
            _First->Data = tValue;
            _First->Next = null;
            _First->Prev = null;
            _Last = _First;
        }
        else
        {
            pResult = _Memory::New< _DListNode<T> >(1);

            pResult->Data = tValue;
            pResult->Next = null;
            pResult->Prev = _Last;

            _Last->Next = pResult;
            _Last = pResult;
        }
        ++_Count;

        this->_so = _SortOrder::s_null;   //要重新排序

        return pResult;
    }

    /// <summary>
    /// 添加一个链表
    /// </summary>
    /// 创建时间: ????-??-??      最后一次修改时间:2024-09-22
    inline _DListNode<T>* Add(const _DList<T>& dList)
    {
        _DListNode<T>* pResult = null;

        _DListNode<T>* pNode = dList._First;
        while (pNode != null)
        {
            if (pResult == null) 
                pResult = Add(pNode->Data);
            else
                Add(pNode->Data);

            pNode = pNode->Next;
        }

        return pResult;
    }
protected:
    /// <summary>
    /// 在结点pItemNode后面插入一个结点,成功,返回新的结点,否则返回NUll;
    /// 如果pItemNote == null,则默认在后面添加一个项。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="pItemNode">当前结点</param>
    /// <param name="rValue"></param>
    /// <returns></returns>
    /// 创建时间: ????-??-??      最后一次修改时间:2024-09-22
    inline virtual _DListNode<T>* InserNodeBack(_DListNode<T>* pNoteItem, const T& tValue)
    {
        if (pNoteItem == null || _Count == 0) return this->Add(tValue);

        this->SortOrder = _SortOrder::s_null;

        _DListNode<T>* pNode = _Memory::New<_DListNode<T>>(1);
        pNode->Data = tValue;


        //pNode
        pNode->Prev = pNoteItem;
        pNode->Next = pNoteItem->Next;



        //pListItem->Next
        if (pNoteItem->Next != null) {

            pNoteItem->Next->Prev = pNode;

        }else{
            _Last = pNode;
        }
         
        //--pNoteItem
        pNoteItem->Next = pNode;


        ++_Count;

        return pNode;

    }

    /// <summary>
    /// 在结点pNoteItem前面插入一个结点,成功,返回新的结点,否则返回null
    /// 如果pItemNote == null,则默认在后面添加一个项。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="pListItem"></param>
    /// <param name="rData"></param>
    /// <returns></returns>
    /// 创建时间: ????-??-??      最后一次修改时间:2024-09-22
    inline virtual _DListNode<T>* InserNodeFront(_DListNode<T>* pNoteItem, const T& tValue)
    {
        if (pNoteItem == null || _Count == 0) return this->Add(tValue);

        this->SortOrder = _SortOrder::s_null;

        if (pNoteItem == null) return null;

        _DListNode<T>* pNode = _Memory::New<_DListNode<T>>(1);
        pNode->Data = tValue;


        //pNode            
        pNode->Next = pNoteItem;
        pNode->Prev = pNoteItem->Prev;



        //--pListItem->Prev
        if (pNoteItem->Prev != null){

            pNoteItem->Prev->Next = pNode;

        }else{

            _First = pNode;
        }

        //pNoteItem
        pNoteItem->Prev = pNode;


        ++_Count;

        return pNode;

    }


    //------------------------------------------------------------操作         
public:

 
    /// <summary>
    /// 如果已排好序,它会按二分法查找,否则它会普通查找。
    /// </summary>
    /// <param name="item"></param>
    /// <returns></returns>
    /// 创建时间: ????-??-??      最后一次修改时间:????_??_??       已测试
    inline int BinarySearch(const T& item)const {
        switch (this->_so)
        {
        case _SortOrder::s_Maxmin:
        {
            if (_Count == 0)
            {
                return -1;
            }
            if (_Count == 1)
            {
                //return (_First.Data as IComparable).CompareTo(item) == 0 ? 0 : -1;  //C#

                return _First->Data == item ? 0 : -1;
            }
            if (_Count == 2)
            {
                //if ((_First.Data as IComparable).CompareTo(item) == 0) return 0;
                //if ((_First.Next.Data as IComparable).CompareTo(item) == 0) return 1;
                if (_First->Data == item) return 0;
                if (_First->Next->Data == item) return 1;

                return -1;
            }

            int nPos = (int)_Count / 2;   //nPos在中间,所以无素一定要大于等于3才行
            int nLeft = 0;   //左边远素
            int nRight = (int)_Count - 1;  //右边远素

            _DListNode<T>* pNode;

            while (nRight >= 0 && nLeft >= 0)
            {
                pNode = IndexOfNode(nPos);

                //int iCom = (item as IComparable).CompareTo(ld.Data);


                if (item > pNode->Data)
                {
                    if (nRight == nLeft || nPos == nLeft)
                    {
                        return -1;
                    }
                    nRight = nPos - 1;
                }
                else if (item < pNode->Data)
                {
                    if (nRight == nLeft || nPos == nRight)
                    {
                        return -1;
                    }
                    nLeft = nPos + 1;
                }
                else
                {
                    return nPos;
                }
                nPos = nLeft + (nRight - nLeft + 1) / 2;
            }

            break;
        }
        case _SortOrder::s_Minmax:
        {
            if (_Count == 0)
            {
                return -1;
            }
            if (_Count == 1)
            {
                //return (_First.Data as IComparable).CompareTo(item) == 0 ? 0 : -1;
                return _First->Data == item ? 0 : -1;
            }
            if (_Count == 2)
            {
                //if ((_First.Data as IComparable).CompareTo(item) == 0) return 0;
                //if ((_First.Next.Data as IComparable).CompareTo(item) == 0) return 1;
                if (_First->Data == item) return 0;
                if (_First->Next->Data == item) return 1;
                return -1;
            }


            int nPos = (int)_Count / 2;   //nPos在中间,所以无素一定要大于等于3才行
            int nLeft = 0;   //左边远素
            int nRight = (int)_Count - 1;  //右边远素

            _DListNode<T>* pNode = null;

            while (nRight >= 0 && nLeft >= 0)
            {
                pNode = IndexOfNode(nPos);
                //int iCom = (item as IComparable).CompareTo(ld.Data);

                if (item < pNode->Data)
                {
                    if (nRight == nLeft || nPos == nLeft)
                    {
                        return -1;
                    }
                    nRight = nPos - 1;
                }
                else if (item > pNode->Data)
                {
                    if (nRight == nLeft || nPos == nRight)
                    {
                        return -1;
                    }
                    nLeft = nPos + 1;
                }
                else
                {
                    return nPos;
                }
                nPos = nLeft + (nRight - nLeft + 1) / 2;
            }
            break;
        }
        case _SortOrder::s_null:
        {
            _DListNode<T>* pNode = _First;
            int iCount = 0;
            while (pNode != null)
            {
                if (pNode->Data == item)
                {
                    return iCount;
                }
                pNode = pNode->Next;
                ++iCount;
            }
            break;
        }
        default:
        {
            return -1;
        }
        }
        return -1;
    }



    /// <summary>
    /// 清除节点,并释放内存
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// 创建时间: ????-??-??      最后一次修改时间:2022-12-24    (已测试)
    inline void ClearData() override { ClearMemory(); }


    /// <summary>
    /// 清除节点,并释放内存
    /// </summary>
    inline void ClearMemory() override
    {
        _Count = 0;

        _DListNode<T>* dn = _First;
        while (dn != null)
        {
            if (dn->Prev != null)
                _Memory::Delete< _DListNode<T> >(dn->Prev, 1);
            dn = dn->Next;
        }

        if (_Last != null)
            _Memory::Delete< _DListNode<T> >(_Last, 1);

        _First = null;
        _Last = null;
        this->_so = _SortOrder::s_null;
    }

    /// <summary>
    /// 复制一个链表,清除原来链表的数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="ld"></param>
    inline void CopyFrom(const _DList<T>& ld)
    {
        if (this != &ld)
        {
            ClearData();
            _DListNode<T>* pNode = ld._First;
            while (pNode != null)
            {
                Add(pNode->Data);
                pNode = pNode->Next;
            }
        }
    }



    /// <summary>
    /// 移除指定索引处的元素
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="iIndex">要移除的元素的从零开始的索引。</param>
    /// <returns>成功返回true,否则返回false</returns>
    /// 创建时间:????-??-?? 最后一次修改时间:2023-04-08
    inline bool RemoveAt(const size_t& nIndex)
    {
        if (nIndex >= _Count) return false;
    
        _DListNode<T>* pNode = _First;

        size_t  nCount = 0;
        while (pNode != null)
        {
            if (nCount == nIndex)
            {
                if (pNode == _First)
                {
                    if (_First->Next == null)   //只有一个
                    {
                        ClearData();
                        return true;
                    }
                    else
                    {

                        _First = _First->Next;
                        _First->Prev = null;
                        --_Count;

                        _Memory::Delete<  _DListNode<T> >(pNode, 1);

                        return true;
                    }
                }
                else if (pNode == _Last)
                {

                    if (_Last->Prev == null)
                    {
                        ClearData();
                        return true;
                    }
                    else
                    { 

                        _Last = _Last->Prev;
                        _Last->Next = null;
                        --_Count;

                        _Memory::Delete< _DListNode<T>>(pNode, 1);

                        return true;
                    }
                }
                else
                {
                    pNode->Prev->Next = pNode->Next;
                    pNode->Next->Prev = pNode->Prev;

                    --_Count;

                    _Memory::Delete< _DListNode<T>>(pNode, 1);
                    return true;
                }
            }
            pNode = pNode->Next;
            ++nCount;
        }
        return false;
    }


 

    
    /// <summary>
    /// 在节点中查找一项数据,这项数据值与tData相同
    /// </summary>
    /// <param name="tData"></param>
    /// <returns></returns>
    /// 创建时间:????-??-?? 最后一次修改时间:2024-09-20
    inline _DListNode<T>* FindNodeItem(const T& tValue)const
    {
        switch (this->_so)
        {
        case _SortOrder::s_Maxmin:
        {
            if (_Count == 0)
            {
                return null;
            }
            if (_Count == 1)
            {
                //return (_First.Data as IComparable).CompareTo(tValue) == 0 ? _First : null;
                return _First->Data == tValue ? _First : null;
            }
            if (_Count == 2)
            {
                //if ((_First.Data as IComparable).CompareTo(tValue) == 0) return _First;
                //if ((_First.Next.Data as IComparable).CompareTo(tValue) == 0) return _First.Next;

                if (_First->Data == tValue) return _First;
                if (_First->Next->Data == tValue) return _First->Next;
                return null;
            }

            int nPos = (int)(_Count / 2);   //nPos在中间,所以无素一定要大于等于3才行
            int nLeft = 0;   //左边远素
            int nRight = (int)(_Count - 1);  //右边远素

            _DListNode<T>* pNode = null;

            while (nRight >= 0 && nLeft >= 0)
            {
                pNode = IndexOfNode(nPos);

                //int iCom = (tValue as IComparable).CompareTo(ld.Data);

                if (tValue > pNode->Data)
                {
                    if (nRight == nLeft || nPos == nLeft)
                    {
                        return null;
                    }
                    nRight = nPos - 1;
                }
                else if (tValue < pNode->Data)
                {
                    if (nRight == nLeft || nPos == nRight)
                    {
                        return null;
                    }
                    nLeft = nPos + 1;
                }
                else
                {
                    return pNode;
                }
                nPos = nLeft + (nRight - nLeft + 1) / 2;
            }

            break;
        }
        case _SortOrder::s_Minmax:
        {
            if (_Count == 0)
            {
                return null;
            }
            if (_Count == 1)
            {
                //return (_First.Data as IComparable).CompareTo(tValue) == 0 ? _First : null;
                return _First->Data == tValue ? _First : null;
            }
            if (_Count == 2)
            {
                //if ((_First.Data as IComparable).CompareTo(tValue) == 0) return _First;
                //if ((_First.Next.Data as IComparable).CompareTo(tValue) == 0) return _First.Next;

                if (_First->Data == tValue) return _First;
                if (_First->Next->Data == tValue) return _First->Next;

                return null;

            }


            int nPos = (int)(_Count / 2);   //nPos在中间,所以无素一定要大于等于3才行
            int nLeft = 0;   //左边远素
            int nRight = (int)(_Count - 1);  //右边远素

            _DListNode<T>* pNode = null;

            while (nRight >= 0 && nLeft >= 0)
            {
                pNode = IndexOfNode(nPos);

                //int iCom = (tValue as IComparable).CompareTo(ld.Data);

                if (tValue < pNode->Data)
                {
                    if (nRight == nLeft || nPos == nLeft)
                    {
                        return null;
                    }
                    nRight = nPos - 1;
                }
                else if (tValue > pNode->Data)
                {
                    if (nRight == nLeft || nPos == nRight)
                    {
                        return null;
                    }
                    nLeft = nPos + 1;
                }
                else
                {
                    return pNode;
                }
                nPos = nLeft + (nRight - nLeft + 1) / 2;
            }
            break;
        }
        case _SortOrder::s_null:
        {
            _DListNode<T>* pNode = _First;

            while (pNode != null)
            {
                //总结:Equals比较的永远是变量的内容是否相同,而= =比较的则是引用地址是否相同(前提:此种类型内部没有对Equals 或= = 进行重写操作,
                //否则输出可能会有不同)。string 类型是个特例,因为他的内部对这两个都进行了重写。

                if (tValue == pNode->Data)
                {
                    return pNode;
                }

                /*
                if (pNode.Data.Equals(tValue))
                {
                    return pNode;
                }
                */
                pNode = pNode->Next;
            }
            break;
        }
        default:
        {
            return null;
        }
        }
        return null;
    }


    inline _DListNode<T>* Find(const T& tValue)const { return FindNodeItem(tValue); }

    /// <summary>
    /// 在链接中查找节点,返回节点的索引
    /// </summary>
    /// <param name="pFind"></param>
    /// <returns></returns>
    /// 创建时间:2024-07-03 最后一次修改时间:2024-07-03
    inline int FindNodeIndex(const _DListNode<T>* pFind)const
    {
        if (pFind != null){

            _DListNode<T>* pNode = _First;

            int nIndex = 0;
            while (pNode != null){

                if (pNode == pFind)
                    return nIndex;

                pNode = pNode->Next;
                ++nIndex;  
            }
        }
        return -1;
    }


    /// <summary>
    /// 删除链表中的数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="pData"></param>
    /// <returns></returns>
    inline bool RemoveItem(const T& pData)
    {
        if (this->_so == _SortOrder::s_null)
        {
            _DListNode<T>* pNode = _First;

            while (pNode != null)
            {
                if (pNode->Data == pData)	//找到一项
                {
                    if (pNode == _First)		//删除的是第一个节点
                    {
                        if (_First->Next != null)
                        {
                            _First->Next->Prev = null;
                            _First = _First->Next;
                        }
                        else
                        {
                            _First = null;
                            _Last = null;
                        }
                    }
                    else if (pNode == _Last)  //删除的是最后一个节点
                    {
                        if (_Last->Prev != null)
                        {
                            _Last->Prev->Next = null;
                            _Last = _Last->Prev;
                        }
                        else
                        {
                            _Last = null;
                            _Last = null;
                        }
                    }
                    else						//删除的是中间的一个节点
                    {
                        pNode->Next->Prev = pNode->Prev;
                        pNode->Prev->Next = pNode->Next;
                    }
                    --_Count;
                    return true;
                }

                pNode = pNode->Next;

            }

            return false;
        }
        else
        {
            return RemoveAt(BinarySearch(pData));
        }
    }



    /// <summary>
    /// 删除最后一个节点
    /// </summary>
    /// 创建时间:2020-09-12  最后一次修改时间: 2023-01-18
    inline bool DeleteLast()
    {
        auto pDelete = Last();

        if (_Count <= 0)
        {
            return false;
        }
        else if (_Count == 1)
        {
            _First = null;
            _Last = null;
            _Count = 0;
        }
        else if (_Count == 2)
        {
            _Last = _First;
            _Last->Prev = null;
            _Last->Next = null;

            _First->Next = null;
            _First->Prev = null;

            --_Count;
        }
        else
        {
            _Last->Prev->Next = null;

            _Last = _Last->Prev;

            --_Count;
        }

        _Memory::Delete<_DListNode<T>>(pDelete, 1);

        return true;
    }

    /// <summary>
    /// 添加一个元素,并把它放在首位,其它元素后移,如果后面的元素删除,总无素个数不变,如果元素个数为零,则添加一个无素。
    /// </summary>
    /// <param name="Item"></param>
    /// <param name="bRemoveLast"></param>
    /// 创建时间: 2022-04-19      最后一次修改时间:2022-04-19
    inline void HistoryAdd(const T& Item, bool bRemoveLast)
    {
        if (_Count == 0) {
            Add(Item);
        }
        else if (_Count == 1) {
            if (bRemoveLast) {
                _First->Data = Item;
            }
            else {
                //把无素放在最前
                _DListNode<T>* dnNew = _Memory::New<_DListNode<T>>(1);
                dnNew->Data = Item;
                _First->Prev = dnNew;
                dnNew->Next = _First;
                _First = dnNew;
                ++_Count;
            }
        }
        else {
            if (bRemoveLast) {
                _DListNode<T>* dnDelete = _Last;

                //删除最后一个元素
                _Last = _Last->Prev;
                _Last->Next = null;

                _DListNode<T>* dnNew = _Memory::New<_DListNode<T>>(1);
                dnNew->Data = Item;

                _First->Prev = dnNew;
                dnNew->Next = _First;
                dnNew->Prev = null;

                _First = dnNew;

                _Memory::Delete< _DListNode<T>>(dnDelete, 1);
            }
            else {
                //把无素放在最前
                _DListNode<T>* dnNew = _Memory::New<_DListNode<T>>(1);
                dnNew->Data = Item;

                _First->Prev = dnNew;
                dnNew->Next = _First;
                dnNew->Prev = null;

                _First = dnNew;

                ++_Count;
            }
        }
    }

    /// <summary>
    /// 出栈(先进后出),删除最后一个元素,
    /// </summary>
    /// 创建时间: 2022-04-19      最后一次修改时间:2023-04-06
    inline T StackPop()
    {
        assert(_Count > 0);

        T tResult = _Last->Data;

        this->RemoveAt(_Count - 1);

        return tResult;
    }

    //----------------------------------------------------------------------------------------------------Python List方法
     

    /// <summary>
    /// 将元素tItem添加到列表末尾。
    /// </summary>
    /// 创建时间: 2023-04-08      最后一次修改时间:2023-04-08
    inline void Python_append(const T& tItem)
    {
        Add(tItem);
    }

     

    /// <summary>
    /// 在位置nIndex后面插入一个元素tItem
    /// </summary>
    inline void Python_insert(const size_t  &nIndex, const T& tItem)
    {
        InserNodeBack(IndexOfNode(nIndex), tItem);
    }
     
    /// <summary>
    /// 在最前面插入一项
    /// </summary>
    /// <param name="tItem"></param>
    /// 创建时间: 2024-04-16      最后一次修改时间:2024-09-19
    inline void inseart_front(const T& tItem)
    {
        this->SortOrder = _SortOrder::s_null;

        _DListNode<T>* pNode = _Memory::New<_DListNode<T>>(1);
        pNode->Data = tItem;

        if (_First != null)
        {
            _First->Prev = pNode;

            pNode->Next = _First;
            pNode->Prev = null;

            _First = pNode;
        }
        else
        { 
            pNode->Next = null;
            pNode->Prev = null;

            _First = pNode;
            _Last = pNode;
        }

        ++_Count;
    }


    inline _DListNode<T>* inseart_back(_DListNode<T>* pNode, const T& tData) {
        return this->InserNodeBack(pNode, tData);
    }

    inline _DListNode<T>* inseart_front(_DListNode<T>* pNode, const T& tData) {
        return this->InserNodeFront(pNode, tData);
    }

   
    /// <summary>
    /// 删除索引位置为nIndex的元素,并返回删除的元素值的拷贝,如果索引值nIndex = -1,则默认删除为最后一个元素。
    /// </summary>
    /// <param name="nIndex"></param>
    /// <returns></returns>
    /// 创建时间: 2023-04-08      最后一次修改时间:2023-04-09
    inline T Python_pop(const size_t nIndex = npos)
    {
        
        if (nIndex == npos)
        {         
            return StackPop();
        }
        else
        { 
            auto dn = this->IndexOfNode(nIndex);

            T tmp = T();

            if (dn != null)
            {
                tmp = dn->Data;                  

                DeleteNode(dn);
            }

            return tmp;
        }         
    }

     
    /// <summary>
    /// 删除值为tItem的一项。
    /// 注意,方法remove()只删除第一个指定的值。如果要删除的值可能在列表中出现多次,
    /// 就需要使用循环来确保每个值都删除。
    /// </summary>
    inline bool Python_remove(const T& tItem)
    { 
        int n = _Count;

        DeleteNode(FindNodeItem(tItem));

        return n == _Count;
    }



protected:

    /// <summary>
    /// 删除链表中的节点
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="pListItem"></param>
    /// <returns></returns>
    //inline bool DeleteNode(const _DListNode<T>* pNodeDelete)
    //{
    //    if (_Count == 0 || pNodeDelete == null)
    //    {
    //        return false;
    //    }

    //    _DListNode<T>* pNode = _First.Next;

    //    while (pNode != null)
    //    {
    //        if (pNode == pNodeDelete)  //找到了
    //        {
    //            //pListItem->Prev

    //            if (pNodeDelete->Prev != null)
    //            {
    //                pNodeDelete->Prev->Next = pNodeDelete->Next;
    //            }
    //            else //删除的是第一个节点
    //            {
    //                _First = pNodeDelete.Next;
    //            }


    //            //pListItem->Next

    //            if (pNodeDelete->Next != null)
    //            {
    //                pNodeDelete->Next->Prev = pNodeDelete->Prev;
    //            }
    //            else //删除的是最后一个节点
    //            {
    //                _Last = pNodeDelete->Prev;
    //            }

    //            break;
    //        }

    //        pNode = pNode->Next;
    //    }

    //    if (pNode != null)
    //    {
    //        --_Count;

    //        _Memory::Delete< _DListNode<T> >(pNode,1);  //C#不用清除内存

    //        return true;
    //    }

    //    return false;

    //}

  
    
    /// <summary>
    /// 删除链表中的某一节点,注意,这个节点一定要是在链表中的。
    /// </summary>
    /// 创建时间: 2023-04-09      最后一次修改时间:2023-04-09
    inline void DeleteNode(_DListNode<T>* pNodeDelete)
    {
        if (_Count == 0 || pNodeDelete == null) return;

        if (_Count == 1)
        {
            ClearMemory();
        }
        else
        {
            if (pNodeDelete == _First) //删除的是第一个节点
            {
                _First = _First->Next;
                _First->Prev = null;
            }
            else if (pNodeDelete == _Last)
            {
                _Last = _Last->Prev;
                _Last->Next = null;
            }
            else
            {
                pNodeDelete->Prev->Next = pNodeDelete->Next;
                pNodeDelete->Next->Prev = pNodeDelete->Prev;

            }

            --_Count;
            _Memory::Delete< _DListNode<T> >(pNodeDelete, 1);
        }
    }

public:
    //----------------------------------------------------------  C++
    inline void push_back(const T& tItem) { Add(tItem); }

    inline void push_front(const T& tItem) { this->inseart_front(tItem);}

public: //------------------------------------------------------------------重写


 
    /// <summary>
    /// 转换为字符串
    /// </summary>
    /// <returns></returns>
    /// 创建时间: 2023-05-16      最后一次修改时间:2024-07-23
    inline virtual  _string ToSplitString(const _string& sSplitString)  const override
    {
        //不可以这样: const _DList<_Object>* dp = (_DList<_Object> *)pList;
        //就算 T 类型数据是从 _Object中继承也不可以。


 
        _string sResult;

        sResult.Add(_t("{"));

        _string sp = sSplitString.Length == 0 ? _string(_t(",")) : sSplitString;


        if(_Count > 0){

            //是否继承处_Object
            if (std::is_base_of<_Object, T>::value)
            {  
                _Object* po;

                if (_Count == 1)
                {
                    po = (_Object*)(&_First->Data);

                    sResult.Add((_string)(*po));
                }

                _DListNode<T>* dn = this->_First;
                while (dn != _Last)
                {
                    po = (_Object*)(&dn->Data);

                    sResult.Add((_string)(*po));
                    sResult.Add(sp);

                    dn = dn->Next;
                }
                po = (_Object*)(&_Last->Data);


                sResult.Add((_string)(*po));
            }
            else
            {

                if (typeid(T) == typeid(int))
                {
                    _DListNode<T>* dn = this->_First;
                    while (dn != _Last)
                    {
                        int* pInt = (int*)&(dn->Data);
                        sResult.Add(_string::Java_valueOf(*pInt));
                        sResult.Add(sp);

                        dn = dn->Next;
                    }

                    if (this->Count > 0)
                        sResult.Add(_string::Java_valueOf(*((int*)(&(_Last->Data)))));
                }         
                else if(typeid(T) == typeid(size_t))
                {
                    _DListNode<T>* dn = this->_First;
                    while (dn != _Last)
                    {
                        size_t* pInt = (size_t*)&(dn->Data);
                        sResult.Add(_string::Java_valueOf(*pInt));
                        sResult.Add(sp);

                        dn = dn->Next;
                    }

                    if (this->Count > 0)
                        sResult.Add(_string::Java_valueOf(*((size_t*)(&(_Last->Data)))));
                }
                else if (typeid(T) == typeid(double))
                {
                    if (_Count == 0) return sResult;

                    double* pd;

                    if (_Count == 1)
                    {
                        pd = (double*)(&(_First->Data));

                        sResult.Add(_Convert::DoubleToString(*pd));
                    }

                    _DListNode<T>* dn = this->_First;
                    while (dn != _Last)
                    {
                        pd = (double*)&(dn->Data);
                        sResult.Add(_Convert::DoubleToString(*pd));
                        sResult.Add(sp);

                        dn = dn->Next;
                    }
                    pd = (double*)&(_Last->Data);
                    sResult.Add(_Convert::DoubleToString(*pd));
                }
                else if (typeid(T) == typeid(_string))
                {
                    _string* ps;

                    _DListNode<T>* dn = this->_First;
                    while (dn != _Last)
                    {
                        ps = (_string*)(&dn->Data);

                        sResult.Add(_t("\""));
                        sResult.Add(*ps);
                        sResult.Add(_t("\""));
                        sResult.Add(sp);
                        dn = dn->Next;
                    }

                    if (_Count > 0)
                    {
                        ps = (_string*)(&_Last->Data);
                        sResult.Add(_t("\""));
                        sResult.Add(*ps);
                        sResult.Add(_t("\""));
                    }
                }
                else if (typeid(T) == typeid(_StrA))
                {
                    _StrA* ps;

                    if (_Count <= 0)
                    {
                    }
                    else if (_Count == 1)
                    {
                        ps = (_StrA*)(&_First->Data);

                        sResult.Add(_t("\""));
                        sResult.Add(*ps);
                        sResult.Add(_t("\""));
                    }
                    else
                    {
                        _DListNode<T>* dn = this->_First;
                        while (dn != _Last)
                        {
                            ps = (_StrA*)(&dn->Data);

                            sResult.Add(_t("\""));
                            sResult.Add(*ps);
                            sResult.Add(_t("\""));
                            sResult.Add(_t(','));

                            dn = dn->Next;
                        }
                        ps = (_StrA*)(&_Last->Data);

                        sResult.Add(_t("\""));
                        sResult.Add(*ps);
                        sResult.Add(_t("\""));
                    }
                }
                else if (typeid(T) == typeid(std::string)) {

                    std::string* ps;

                    if (_Count <= 0)
                    {
                    }
                    else if (_Count == 1)
                    {
                        ps = (std::string*)(&_First->Data);

                        sResult.Add(_t("\""));
                        sResult.Add(_string(ps->c_str()));
                        sResult.Add(_t("\""));
                    }
                    else
                    {
                        _DListNode<T>* dn = this->_First;
                        while (dn != _Last)
                        {
                            ps = (std::string*)(&dn->Data);

                            sResult.Add(_t("\""));
                            sResult.Add(_string(ps->c_str()));
                            sResult.Add(_t("\""));
                            sResult.Add(_t(','));

                            dn = dn->Next;
                        }
                        ps = (std::string*)(&_Last->Data);

                        sResult.Add(_t("\""));
                        sResult.Add(_string(ps->c_str()));
                        sResult.Add(_t("\""));
                    }
                }
                else  //所有继承自 _Object 类的数据类型都可以
                {

                    sResult.Add(_t("_LDList::ToSplitString重写,数据类型为:"));
                    sResult.Add(_string(typeid(T).name()));            


                }
            }

        }

        sResult.Add(_t("}"));

        return sResult;
  
    }

    inline _string ToString()const
    {
        return ToSplitString(_t(""));
    }

    //

                                //std

    

    /// <summary>
    /// 在_Where位置前插入[itBegin,itEnd)(用法与std::list::insert要一样)
    /// 注意:std旧重版itBegin和itEnd不能指向与目的位置相同的容器,在新标准版可以。
    /// </summary>
    /// <typeparam name="IteratorClass"></typeparam>
    /// <param name="_Where"></param>
    /// <param name="itBegin"></param>
    /// <param name="itEnd"></param>
    /// 创建时间: 2024-09-22      最后一次修改时间:2024-09-22 (已测试)
    template<class IteratorClass>
    inline _DListNodeIterator<T> std_insert(const _DListNodeIterator<T>& _Where, const IteratorClass& itBegin,
        const IteratorClass& itEnd) {

        /*
            list slist;      
            //运行时错误:迭代器表示要拷贝的范围,不能指向与目的位置相同的容器
            slist.insert(slist.begin(),slist.begin(),slist.end());
       
        */

        if (typeid(_DListNodeIterator<T>) == typeid(IteratorClass)) {

            _DListNodeIterator<T>* pbegin = (_DListNodeIterator<T>*)(&itBegin);
            _DListNodeIterator<T>* pend = (_DListNodeIterator<T>*)(&itEnd);

            //lassert(_Where._pCurrentList != p->_pCurrentList,"不能插入指向相同容器的元素");
            if (_Where._pCurrentList == pbegin->_pCurrentList) {

                //创建一个临时链表,会影响性能
                _DList<T> tmp(*pbegin,*pend);
                return std_insert(_Where, tmp.begin(), tmp.end());
            }            
        }     

        IteratorClass tmp = itBegin;

        _DListNode<T>* pReulst = null;

        if (_Where._Ptr == null) {

            while (tmp != itEnd) {

                if (pReulst == null) {
                    //保存第一次插入的结点,以便返回
                    pReulst = this->inseart_back(_Last, *tmp);
                }
                else
                    this->inseart_back(_Last, *tmp);
                ++tmp;
            }

        }
        else {

            auto ptr = _Where._Ptr;

            while (tmp != itEnd) {
                if (pReulst == null) //第一次,在前面插入第一项
                {
                    ptr = this->inseart_front(ptr, *tmp);
                    //保存第一次插入的结点,以便返回

                    pReulst = ptr;
                }
                else { //第二次开始,在插入的第一项后面依次插入
                    ptr = this->inseart_back(ptr, *tmp);
                }

                ++tmp;
            }
        }

        return _DListNodeIterator<T>(pReulst, this);
    }

    /// <summary>
    /// std::insert
    /// </summary>
    /// <param name="_Where"></param>
    /// <param name="_Ilist"></param>
    /// <returns></returns>
    /// 创建时间: 2024-09-22      最后一次修改时间:2024-09-22 (已测试)
    inline _DListNodeIterator<T> std_insert(const _DListNodeIterator<T>& _Where,
        std::initializer_list<T> _Ilist) {
        return std_insert(_Where, _Ilist.begin(), _Ilist.end());
    }

    /// <summary>
    /// std::insert
    /// </summary>
    /// <param name="_Where"></param>
    /// <param name="tValue"></param>
    /// <returns></returns>
    /// 创建时间: 2024-09-22      最后一次修改时间:2024-09-22  (已测试)
    inline _DListNodeIterator<T> std_insert(const _DListNodeIterator<T>& _Where, const T& tValue) {
        if (_Where._Ptr == null)
            return _DListNodeIterator<T>(inseart_back(_Last, tValue), this);
        else
            return _DListNodeIterator<T>(inseart_front(_Where._Ptr, tValue), this);
    }




}; //--------------------------------------------------------------------------DList

 
 


//


                                //SortedDList



//

/// <summary>
///  C#语句:public class SortList<T> : _DList<T>
/// </summary>
/// <typeparam name="T"></typeparam>
template<class T>
class SortedDList : public _DList<T>
{


};


//


                                //_StrList



// 
template<class T>
class _StrList : public _DList<T>
{

public:  
    //------------------------------------------------------------------构造与析构 

    _StrList() : _DList<T>() {};

    _StrList(const _StrList<T>& sl) : _DList<T>(sl) {};

    explicit _StrList(const _char* pStr, const _char* pSplit, bool bIgnoreEmptyString = false)
    {
        this->InitData();
        SplitForSeparator(pStr, pSplit, bIgnoreEmptyString);
         
    }


    /// <summary>
    /// 要加上 explicit阻止自动转换, 否则执行语名会自动调用这个构造函数  _StrList  ls = { L"AA",L"BB"};
    /// </summary>
    /// <param name="sText"></param>
    /// <param name="sSplit"></param>
    /// <param name="bIgnoreEmptyString"></param>
    explicit _StrList(const T& sText, const T& sSplit, bool bIgnoreEmptyString = false)
    {
        //assert(sText != null && sSplit != null);

        //SplitForSeparator(sText.Data, sSplit.Data, bIgnoreEmptyString);
         
        if (sText.Length == 0) { return; }


        if (sSplit.Length == 0) { Add(sText);   return; }


        int iStart = 0;
        int iIndex = sText.IndexOf(sSplit, iStart);

        if (iIndex == -1)
        {
            Add(sText);
            return;
        }



        while (iIndex != -1 && iStart + 1 <= sText.Length)
        {
            if (iIndex != iStart)
                Add(sText.SubStr(iStart, iIndex - iStart));
            else
            {
                if (!bIgnoreEmptyString) Add(T());
            }
            iStart = iIndex + sSplit.Length;

            iIndex = sText.IndexOf(sSplit, iStart);

            if (iIndex == -1 && sText.Length != iStart)
                Add(sText.SubStr(iStart, sText.Length - iStart));  //拷贝最后一个
        }
       
    }



    _StrList(std::initializer_list<T> aList)
    {
        for (T s : aList)
        {
            Add(s);
        }
    }

public: 
     
    
    //------------------------------------------------------------------操作

    void writeToFile(const T& sFullPathName)
    {
         
    }


    bool readToFile(const T& sFullPathName)
    {
        return false;
    }


    bool readToUnicodeFile(const T& sFileName, const T& sSplit)
    {
        return false;
    }


    /// <summary>
    /// 获取所有字符串的总共长度
    /// </summary>
    /// <returns></returns>
    /// 创建时间:  2022-11-05    最后一次修改时间:  2022-11-05 
    int GetStringLength() const
    {
        int iSum = 0;

        auto dn = this->_First;

        while (dn != null) {
            iSum += (int)dn->Data.Length;
            dn = dn->Next;
        }

        return iSum;
    }


    T connectForSeparator(const T& sConnector)const
    {
        if (this->_Count == 0) return _t("");

        if (this->_Count == 1) return this->_First->Data;

        T tmp(_t(""), GetStringLength() + sConnector.Length * this->_Count + 100);

        _DListNode<T>* ldNode = this->_First;

        while (ldNode != this->_Last)
        {
            tmp += ldNode->Data;
            tmp += sConnector;
            ldNode = ldNode->Next;
        }


        tmp += this->_Last->Data;       //加入最后一项

        return tmp;
    }

    T connectForSeparator(const _char& cConnector) const
    {
        return connectForSeparator(&cConnector);
    }




    /// <summary>
    /// 返回分隔后的字符串列表
    /// </summary>
    /// <param name="pStr">原文本</param>
    /// <param name="pSplit">分隔字符串</param>
    /// <param name="bIgnoreEmptyString">是否忽略空字符串</param>
    /// <returns>返回一个字符串列表</returns>
    /// 创建时间: 2022-10-04     最后一修改时间:2022-10-05       已测试
    _StrList<T>& SplitForSeparator(const _char* pStr, const _char* pSplit, bool bIgnoreEmptyString)
    {

        if (pStr == null || pSplit == null)
        {
            _cout << "在中_StrList::SplitForSeparator中" << L"pStr == null || pSplit == null" << "\n";

            throw "pStr == null || pSplit == null";
        }


        this->ClearData();

        if (pStr[0] == 0 || pSplit[0] == 0)
        {
            Add(_t(""), 0, 0);
            return *this;
        }


        int i = 0;
        int j = 0;

        int nStart = 0, nEnd = 0;

        while (pStr[i] != 0) {

            // _cout << _t("pStr[i] = ") << pStr[i] << _t("\n");  //此句出错,无任何提示

            bool bFind = true;

            j = 0;
            while (pSplit[j] != 0) {

                if (pStr[i + j] != pSplit[j]) {
                    bFind = false;
                    break;
                }
                ++j;
            }

            if (bFind) {
                nEnd = i - 1;     //此处如果 nEnd 是 int ,则 nEnd = i - 1 => nEnd = 18446744073709551615 => 溢出错误 
                if (bIgnoreEmptyString) {
                    if (nStart <= nEnd) {
                        Add(pStr, nStart, nEnd);  //这里应nStart <= nEnd,而不是 nStart < nEnd,因为当 nStart = nEnd 还是有一个字符的
                    }
                }
                else {
                    Add(pStr, nStart, nEnd);
                }

                nStart = i + j;

                i = nStart - 1;
            }
            ++i;
        }



        //拷贝右边最后一项
        if (bIgnoreEmptyString) {
            if (nStart <= i - 1) {
                Add(pStr, nStart, (int)i - 1);
            }
        }
        else {
            Add(pStr, nStart, (int)i - 1);
        }

        return *this;
    }

    //int SplitForSeparator(const T& sText, const _char& cSplit);

    int IndexOf(const T& s)
    {
        int nIndex = 0;

        auto dn = this->_First;

        while (dn)
        {

            if (dn->Data == s) { return nIndex; }

            ++nIndex;

            dn = dn->Next;
        }

        return -1;
    }


    int GetMaxSpaceLength(int nTabCount = 9, int nChineseCharactersCount = 3)const
    {
        int nMax = 0;

        auto dn = this->_First;

        while (dn)
        {
            int n = gs.s_length_space(dn->Data.Data, nTabCount, nChineseCharactersCount);

            if (n > nMax) nMax = n;

            dn = dn->Next;
        }
        return nMax;
    }
 



    /// <summary>
    /// 用tab键使每行等长
    /// </summary>
    /// <param name="nTabCount"></param>
    /// <returns></returns>
    /// 创建时间:  2022-10-30    最后一次修改时间:  2022-10-30 
    T equilongTabLine(int nTabCount = 9)
    {
        this->RemoveHeadTab();

        int iMax = GetMaxSpaceLength(nTabCount);

        for (T& s : *this) {
            int nSapceLength = gs.s_length_space(s.Data);
            int n = (iMax - nSapceLength) / 9;

            if (iMax - nSapceLength - n * 9 >= 5)
                ++n;
            else
                --n;

            for (int j = 0; j < n; j++)
            {
                s.Add(_t("\t"));
            }
        }


        return connectForSeparator(_t('\n')) + _t('\n');
    }


    /// <summary>
    /// 计算所有行,如果每行都有开始处都有 \t ,则每行除去 \t , 除去个数以最少 \t 行为准。
    /// 例:
    /// \t\t abc
    /// \t bcd
    /// \t\t\t dd
    /// 运行函数后变成
    /// \t abc
    /// bcd
    /// \t\t dd
    /// </summary>
    /// 创建时间:  2022-11-05    最后一次修改时间:  2022-11-05 
    void RemoveHeadTab()
    {
        int iMin = 100000000;

        for (T& s : *this) {

            if (s.Length > 0)
            {
                int iCount = gs.s_headTabCount(s.Data);
                if (iCount < iMin) { iMin = iCount; }

                //log::d("iCount=" + iCount.ToString(), s);
            }
        }

        //log::d("iMin=" + iMin.ToString());

        if (iMin > 0)
        {
            for (T& s : *this) {
                s = s.SubStr(iMin, s.Length - iMin);
            }
        }
    }

    //-----------------------------------------------------------------------虚函数
    virtual _DListNode<T>* Add(const T& item) override
    {
        //_cout << item << "\n";
        return _DList<T>::Add(item);
    }



    void Add(const _StrList<T>& ls)   //覆盖 父类重载函数 virtual bool Add(const T& item);
    {
        _DListNode<T>* pNode = ls._First;

        while (pNode != null)
        {
            Add(pNode->Data);
            pNode = pNode->Next;
        }
    }


    /// <summary>
    /// 添加拷贝nStartPos和nEndPos之间的字符,包括nStartPos和nEndPos。
    /// </summary>
    /// <param name="str"></param>
    /// <param name="nStartPos"></param>
    /// <param name="nEndPos"></param>
    /// <returns></returns>
    /// 创建时间:  ????-??-??   最后一次修改时间:????-??-??   已测试(2024-08-16 )
    bool Add(const T& str, int nStartPos, int nEndPos)
    {
        if (str.Length == 0 || nEndPos - nStartPos < 0)
        {
            Add(T());
        }
        else {
            int nLength = nEndPos - nStartPos + 1;

            /*
            _Mem<_char> m(nLength + 1);

            for (int i = 0; i < nLength; ++i)
            {
                m.Data[i] = pStr[nStartPos + i];

            }

            m.Data[nLength] = 0;
            */
            Add(str.SubStr(nStartPos, nLength));
        }

        return false;
    }
 

    _string  ToSplitString(const _string& sSplitString) const  override
    {
        /*
        *  auto dn = this->_First;

        T sResult;
  
        while (dn != this->_Last)
        {           
            sResult.std_append(dn->Data);                          
            
            sResult.std_append(sConnector);

            dn = dn->Next;
        }

        if (this->_Last != null)
        {
            sResult.std_append(dn->Data);
        }

        char c = '\n';

        sResult.std_append(c );

        return sResult;
        */
        return _DList<T>::ToSplitString(sSplitString);
    }
};

//


                                //_UStrList



// 
/// <summary>
/// 不重复的字符串列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// 创建时间: 2023-05-11      最后一次修改时间:2023-05-11
template<class T>  
class _UStrList : public _StrList<T>
{ 
public:
    /// <summary>
    /// 加入一个串,如果这个串存在,则把这项移到最后。
    /// </summary>
    /// <param name="item"></param>
    /// 创建时间: ????-??-??      最后一次修改时间:2024-09-23 (已测试)
    _DListNode<T>* Add(const T& item)override
    {  
        bool bFind = false;
        _DListNode<T>* dnTemp = this->_First;
        while (dnTemp != null)
        {
            if (dnTemp->Data == item){
               
                return this->MoveLast(dnTemp);             
            }
            dnTemp = dnTemp->Next;
        }

        return _StrList<T>::Add(item);       
    }
  
};

//


                                //_UStrListCI



// 
/// <summary>
/// 值都是唯一的字符串列表,  Case Insensitive(不区分大小写)
/// </summary>
template<class T>
class _UStrListCI : public _StrList<T>
{

public:
    /// <summary>
    /// 加入一个串,如果这个串存在,则把这项移到最后。
    /// </summary>
    /// <param name="item"></param>
    /// 创建时间: ????-??-??      最后一次修改时间:2024-09-23
    _DListNode<T>* Add(const T& item)override
    {
        bool bFind = false;
        _DListNode<T>* dnTemp = this->_First;
        while (dnTemp != null)
        {
            if (dnTemp->Data.csharp_ToLower() == item.csharp_ToLower())
            {
                return this->MoveLast(dnTemp);
            }
            dnTemp = dnTemp->Next;
        }

        return _StrList<T>::Add(item);    
    }

  

    /*

    /// <summary>
    /// 返回前面一个值
    /// </summary>
    /// <param name="tCurrValue"></param>
    /// <returns></returns>
    T& GetForward(T& sCurr)
    {
        int iIndex = BinarySearch(sCurr);
        if (iIndex != -1)
        {
            if (iIndex + 1 < _Count)
                return this[iIndex + 1];
        }
        return null;
    }

    /// <summary>
    /// 返回后面的一个值
    /// </summary>
    /// <param name="sCurr"></param>
    /// <returns></returns>
    T& GetBack(T& sCurr)
    {
        int iIndex = BinarySearch(sCurr);
        if (iIndex != -1)
        {
            if (iIndex - 1 < _Count && iIndex - 1 >= 0)
                return this[iIndex - 1];
        }
        return null;
    }

    */
};


//


                                //_SStrList



// 
/// <summary>
/// 已排序好的字符串列表
/// </summary>
template<class T>
class _SStrList : public  _StrList<T>
{
public:
    _SStrList(const _SortOrder so = _SortOrder::s_Minmax)
    {

        this->_so = so;

        if (this->_so == _SortOrder::s_null)
        {
            throw  _t("排序不能为空!");
        }
    }


    //-------------------------------------------------------------------------------重写

    /// <summary>
    /// 快速添加字符串,差不多用了8个小时(两天),才写成。
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    bool Add(const T& item) override
    {
        if (this->_Count < 3)
        {
            bool bInsert = false;
            _DListNode<T>* ld = this->_First;

            while (ld != null)
            {
                if (this->_so == _SortOrder::s_Maxmin)
                {
                    if (item >= ld->Data)
                    {

                        _StrList<T>::InserNodeFront(ld, item); bInsert = true;
                        break;
                    }
                }
                else
                {
                    if (item <= ld->Data)
                    {
                        _StrList<T>::InserNodeFront(ld, item); bInsert = true; break;
                    }
                }
                ld = ld->Next;
            }
            if (!bInsert) _StrList<T>::Add(item);
            return true;
        }

        int nPos = this->_Count / 2;   //nPos在中间,所以无素一定要大于等于3才行
        int nLeft = 0;   //左边远素
        int nRight = this->_Count - 1;  //右边远素

        if (this->_so == _SortOrder::s_Maxmin)
        {
            _DListNode<T>* ld = null;

            while (nRight >= 0 && nLeft >= 0)
            {
                ld = this->IndexOfNode(nPos);

                if (item >= ld->Data)
                {
                    if (nRight == nLeft || nPos == nLeft)
                    {
                        this->InserNodeFront(ld, item);
                        return true;
                    }
                    nRight = nPos - 1;
                }
                else
                {
                    if (nRight == nLeft || nPos == nRight)
                    {
                        this->InserNodeBack(ld, item);
                        return true;
                    }
                    nLeft = nPos + 1;
                }

                nPos = nLeft + (nRight - nLeft + 1) / 2;
            }
        }
        else
        {
            _DListNode<T>* ld = null;

            while (nRight >= 0 && nLeft >= 0)
            {
                ld = this->IndexOfNode(nPos);

                if (item <= ld->Data)
                {
                    if (nRight == nLeft || nPos == nLeft)
                    {
                        this->InserNodeFront(ld, item);
                        return true;
                    }
                    nRight = nPos - 1;
                }
                else
                {
                    if (nRight == nLeft || nPos == nRight)
                    {
                        this->InserNodeBack(ld, item);
                        return true;
                    }
                    nLeft = nPos + 1;
                }
                nPos = nLeft + (nRight - nLeft + 1) / 2;
            }
        }
        return true;
    }
  

    /// <summary>
    /// 确定某元素是否在列表中
    /// </summary>
    /// <param name="item">查找的对象。对于引用类型,该值可以为 null。</param>
    /// <returns>如果在列表中找到 item,则为 true,否则为 false。</returns>
    bool Contains(const T& item) override
    {
        
        if (this->_Count == 0) return false;
        if (this->_Count == 1) return this->_First->Data == item;
        if (this->_Count == 2) return this->_First->Data == item || this->_First->Next->Data == item;

        int nPos = (int)this->_Count / 2;   //nPos在中间,所以无素一定要大于等于3才行
        int nLeft = 0;   //左边远素
        int nRight = (int)this->_Count - 1;  //右边远素

        _DListNode<T>* ld = null;

        if (this->_so == _SortOrder::s_Maxmin)
        {
            while (nRight >= 0 && nLeft >= 0)
            {
                ld = this->IndexOfNode(nPos);
                int iCom = item.CompareTo(ld->Data);
                if (iCom > 0)
                {
                    if (nRight == nLeft || nPos == nLeft)
                    {
                        return false;
                    }
                    nRight = nPos - 1;
                }
                else if (iCom < 0)
                {
                    if (nRight == nLeft || nPos == nRight)
                    {
                        return false;
                    }
                    nLeft = nPos + 1;
                }
                else
                {
                    return true;
                }
                nPos = nLeft + (nRight - nLeft + 1) / 2;
            }
        }
        else
        {
            while (nRight >= 0 && nLeft >= 0)
            {
                ld = this->IndexOfNode(nPos);
                int iCom = item.CompareTo(ld->Data);

                if (iCom < 0)
                {
                    if (nRight == nLeft || nPos == nLeft)
                    {
                        return false;
                    }
                    nRight = nPos - 1;
                }
                else if (iCom > 0)
                {
                    if (nRight == nLeft || nPos == nRight)
                    {
                        return false;
                    }
                    nLeft = nPos + 1;
                }
                else
                {
                    return true;
                }
                nPos = nLeft + (nRight - nLeft + 1) / 2;
            }
        }
        return false;
    }


};



//


                                //_SUStrList



// 
/// <summary>
/// 值都是唯一的字符串列表,且已排好序,区分大小写
/// </summary>
template<class T>
class _SUStrList : public  _SStrList<T>
{
public:
    bool Add(const T& item)override
    {
        if (this->Contains(item))
            return false;

        return _SStrList<T>::Add(item);
    }

    _SUStrList(_SortOrder so = _SortOrder::s_Minmax) : _SStrList<T>(so)
    {

    }

};

//


                                //_SUStrListUI



// 
/// <summary>
/// _SUStrListUI 值都是唯一,且已排序的字符串列表,不区分大小写
/// </summary>
template<class T>
class _SUStrListUI : public _SUStrList<T>
{
public:
    _SUStrListUI(_SortOrder  st) : _SUStrList<T>(st)
    {

    }


    /// <summary>
    /// 确定某元素是否在列表中
    /// </summary>
    /// <param name="item">查找的对象。对于引用类型,该值可以为 null。</param>
    /// <returns>如果在列表中找到 item,则为 true,否则为 false。</returns>
    bool Contains(const T& item) override
    {
        
        if (this->_Count == 0) return false;
        if (this->_Count == 1) return this->_First->Data.ToLower().CompareTo(item.ToLower()) == 0;
        if (this->_Count == 2) return this->_First->Data.ToLower().CompareTo(item.ToLower()) == 0 || this->_First->Next->Data.ToLower().CompareTo(item.ToLower()) == 0;

        int nPos = (int)this->_Count / 2;   //nPos在中间,所以无素一定要大于等于3才行
        int nLeft = 0;   //左边远素
        int nRight = (int)this->_Count - 1;  //右边远素

        _DListNode<T>* ld = null;

        if (this->_so == _SortOrder::s_Maxmin)
        {
            while (nRight >= 0 && nLeft >= 0)
            {
                ld = this->IndexOfNode(nPos);
                int iCom = item.ToLower().CompareTo(ld->Data.ToLower());
                if (iCom > 0)
                {
                    if (nRight == nLeft || nPos == nLeft)
                    {
                        return false;
                    }
                    nRight = nPos - 1;
                }
                else if (iCom < 0)
                {
                    if (nRight == nLeft || nPos == nRight)
                    {
                        return false;
                    }
                    nLeft = nPos + 1;
                }
                else
                {
                    return true;
                }
                nPos = nLeft + (nRight - nLeft + 1) / 2;
            }
        }
        else
        {
            while (nRight >= 0 && nLeft >= 0)
            {
                ld = this->IndexOfNode(nPos);
                int iCom = item.ToLower().CompareTo(ld->Data.ToLower());

                if (iCom < 0)
                {
                    if (nRight == nLeft || nPos == nLeft)
                    {
                        return false;
                    }
                    nRight = nPos - 1;
                }
                else if (iCom > 0)
                {
                    if (nRight == nLeft || nPos == nRight)
                    {
                        return false;
                    }
                    nLeft = nPos + 1;
                }
                else
                {
                    return true;
                }
                nPos = nLeft + (nRight - nLeft + 1) / 2;
            }
        }
        return false;
    }

     

};// _SUStrListUI











_LF_END_
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2156672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【有啥问啥】深度剖析:大模型AI时代下的推理路径创新应用方法论

深度剖析&#xff1a;大模型AI时代下的推理路径创新应用方法论 随着大规模预训练模型&#xff08;Large Pretrained Models, LPMs&#xff09;和生成式人工智能的迅速发展&#xff0c;AI 在多领域的推理能力大幅提升&#xff0c;尤其是在自然语言处理、计算机视觉和自动决策领…

【C++11】异常处理

目录 一、异常的引入 二、C异常的关键字 三、异常的抛出与处理规则 四、异常缺陷的处理 五、自定义异常体系 六、异常规范 七、异常安全 八、异常的优缺点 1.优点 2.缺点 一、异常的引入 传统的C语言处理异常的方式有两种&#xff1a; 1.终止程序&#xff1a;使用as…

[WMCTF2020]Make PHP Great Again 2.01

又是php代码审计,开始吧. 这不用审吧&#xff0c;啊喂. 意思就是我们要利用require_once()函数和传入的file的value去读取flag的内容.&#xff0c;貌似呢require_once()已经被用过一次了&#xff0c;直接读取还不行&#xff0c;看一下下面的知识点. require_once() require…

Qt 注册表操作

一.操作环境 二.注册表查看 1. 搜索注册表打开 2. 注册表查看 例如我想操作 计算机\HKEY_CURRENT_USER\SOFTWARE\winzq\qwert下的内容 三.代码 1. H文件 #ifndef __REGISTER_H__ #define __REGISTER_H__#include <QString> #include <QSettings> #include <Q…

Web 安全(Web Security)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

信息安全工程师(11)网络信息安全科技信息获取

一、信息获取的重要性 在网络安全领域&#xff0c;及时、准确地获取科技信息对于防范和应对网络威胁至关重要。这些信息可以帮助安全团队了解最新的攻击手段、漏洞信息、防护技术等&#xff0c;从而制定有效的安全策略和应对措施。 二、信息获取的来源 网络信息安全科技信息的获…

s3c2440各部分应用

一、按位运算 按位与&&#xff1a;清零&#xff0c;清零位&0&#xff1b; 如&#xff1a;0xFFFF &&#xff08; ~&#xff08;1 << 7&#xff09;&#xff09;, 将第7位清零。 按位或 | &#xff1a;置1&#xff0c;置1位 | 1&#xff1b; 如&…

MySQL(七)——事务

文章目录 事务事务的概念事务的ACID特性事务的语法查看存储引擎查看自动提交参数和设置手动事务操作保存点 隔离级别与并发事务问题隔离级别并发事务问题 事务 事务的概念 事务&#xff08;Transaction&#xff09;是数据库管理系统中执行过程中的一个逻辑单位&#xff0c;由…

Rx Strategist:智能体实现处方验证的方方面面,如适应症、剂量、药物相互作用

Rx Strategist&#xff1a;智能体实现处方验证的方方面面&#xff0c;如适应症、剂量、药物相互作用 秒懂大纲提出背景&#xff1a;拆解解法分析全流程分析创意 秒懂大纲 ├── 处方验证系统【主题】 │ ├── 背景和问题【问题描述】 │ │ ├── 现代药物复杂性对严…

Java基础面试题——异常

目录 关系图 1. Throwable和Exception之间的关系 2.异常分为哪两大类 3.常见的 RuntimeException 4. 常见的 Error 5.什么是已检查异常和未检查异常&#xff1f;它们的区别是什么&#xff1f; 6.Java 中如何自定义异常&#xff1f; 7.throw 和 throws 的区别是什么&…

ML 系列:机器学习和深度学习的深层次总结(07)数据预处理—解决缺失值、异常值和错误数据

文章目录 一、说明二、数据预处理三、缺失值四、数据集中可能会出现多种类型的缺失值&#xff1a;五、处理缺失值的方法六、结论 一、说明 在AI数据挖掘中&#xff0c;对原始数据的预处理是必须的技术手段&#xff0c;本篇将对数据预处理的一系列注意事项进行展示。 二、数据…

JavaEE: 深入探索TCP网络编程的奇妙世界(五)

文章目录 TCP核心机制TCP核心机制六: 拥塞控制为什么要有拥塞控制?动态调整的拥塞控制拥塞控制中,窗口大小具体的变化过程 TCP核心机制七: 延时应答TCP核心机制八: 捎带应答 TCP核心机制 前一篇文章 JavaEE: 深入探索TCP网络编程的奇妙世界(四) 书接上文~ TCP核心机制六: 拥…

数据结构:二叉树OJ题(基础版)

前言 更完两期二叉树的知识之后&#xff0c;来做几道oj题巩固一下基础 一、翻转二叉树 链接&#xff1a;leetcode链接 还是分治思想&#xff0c;将问题分解成左子树和右子树交换&#xff0c;遇到空树停止 采用递归算法做题 TreeNode* invertTree(TreeNode* root) {if(root …

2D目标检测常用loss

在2D目标检测任务中&#xff0c;常用的损失函数&#xff08;Loss&#xff09;主要用于优化以下三个关键方面&#xff1a; 类别分类&#xff08;Classification&#xff09;&#xff1a;用于区分检测到的对象属于哪一类。边界框回归&#xff08;Bounding Box Regression&#x…

Spring Boot蜗牛兼职网:全栈开发

第4章 系统设计 4.1 系统体系结构 蜗牛兼职网的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 蜗牛兼职网结构图&#xff0c;如图4-3所示。 图4-3 蜗牛兼职网结构图 4.2开发流程设计 系统流程的分析是通…

在Web开发中使用和风天气接口

介绍 和风天气是一个提供全球天气预报和气象数据的服务平台&#xff0c;支持多种语言&#xff0c;提供实时天气、未来天气预报、空气质量指数、生活建议等多种气象数据&#xff0c;可以广泛用于网页开发、移动应用和物联网设备等场景。 开发文档&#xff1a;文档 | 和风天气开…

intellij idea 控制台运行java出现中文乱码的解决方法

原因&#xff1a; 字符编码不一致&#xff1a; 当你在intellij idea使用了UTF-8编码&#xff0c;而在控制台使用了其他编码&#xff08;比如gbk&#xff09;&#xff0c;就可能导致乱码。 文件读写编码问题&#xff1a; 如果读取文件时使用的编码与文件实际编码不一致&#xf…

Chainlit集成LlamaIndex实现知识库高级检索(自动合并检索)

检索原理 自动合并检索 自动合并检索原理&#xff0c;和我的上一篇文章的检索方案&#xff1a; 将文本分割成512大小&#xff08;一般对应段落大小&#xff09;和128&#xff08;一般对句子大小不是严格的句子长度&#xff09;大小两种分别存储到索引库&#xff0c;再用llama_…

《深度学习》—— 卷积神经网络(CNN)的简单介绍和工作原理

文章目录 一、卷积神经网络的简单介绍二、工作原理(还未写完)1.输入层2.卷积层3.池化层4.全连接层5.输出层 一、卷积神经网络的简单介绍 基本概念 定义&#xff1a;卷积神经网络是一种深度学习模型&#xff0c;通常用于图像、视频、语音等信号数据的分类和识别任务。其核心思想…

如何在Markdown写文章上传到wordpress保证图片不丢失

如何在Markdown写文章上传到wordpress保证图片不丢失 写文日期,2023-11-16 引文 众所周知markdown是一款nb的笔记软件&#xff0c;本篇文章讲解如何在markdown编写文件后上传至wordpress论坛。并且保证图片不丢失&#xff08;将图片上传至云端而非本地方法&#xff09; 一&…