新版双向链表,添加了at, front, back, insert, emplace等为了兼容std.

news2024/11/15 5:58:42

例子:

#define _list _DList

int main() {

	list<int> c1 = { 1,2,3,4,5,6,7,8,9,10};
	 

	if (!c1.empty()) {

		c1.front() = 42; //将42赋予c中的一个元素
		auto& v = c1.back();  //获得指向最后一个元素的引用
		v = 1024;  //改变c中的元素
		auto v2 = c1.back();  //v2不是一个引用,它是c.back()的一个拷贝
		v2 = 0; //未改变c中的元素
	}
	

	_pn(c1);


	_list<int> c2 = { 1,2,3,4,5,6,7,8,9,10 };

	if (!c2.empty()) {

		c2.front() = 42; //将42赋予c中的一个元素
		auto& v = c2.back();  //获得指向最后一个元素的引用
		v = 1024;  //改变c中的元素
		auto v2 = c2.back();  //v2不是一个引用,它是c.back()的一个拷贝
		v2 = 0; //未改变c中的元素
	}
	 

	_pn(c2);
}

结果:

部分代码:

 //

                   //下面设计都是为了兼容  std 标准库

 
 
 //----------------------------------------------------------  C++
 

 inline void std_push_back(const T& tItem) { Add(tItem); }
 inline void push_back(const T& tItem) { std_push_back(tItem); }

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

 /// <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>
 /// boject.insert(p,t)	 boject.emplace(p, args)
 /// 在迭代器p指向的元素之前创建一个值为t或由args创建的元	素。
 /// 返回指向新添加的元素的迭代器
 /// </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);
 }


 /// <summary>
 /// boject.insert(p,t)	 boject.emplace(p, args)
 /// 在迭代器p指向的元素之前创建一个值为t或由args创建的元	素。
 /// 返回指向新添加的元素的迭代器
 /// </summary>
 /// <typeparam name="...args"></typeparam>
 /// <param name="it"></param>
 /// <param name="..._Val"></param>
 /// <returns></returns>
 template<class... ArgsTypes>
 inline _DListNodeIterator<T> std_emplace(const _DListNodeIterator<T>& it,
     ArgsTypes&&... args) {        
     return this->std_insert(it, T(std::forward<ArgsTypes>(args)...));
 }

 template<class... ArgsTypes>
 inline _DListNodeIterator<T> emplace(const _DListNodeIterator<T>& it,
     ArgsTypes&&... args) {
     return  std_emplace(it, args...);
 }


 /// <summary>
 /// 
 /// </summary>
 /// <typeparam name="..._Valty"></typeparam>
 /// <param name="..._Val"></param>
 /// <returns></returns>
 /// 创建时间: 2024-09-23      最后一次修改时间:2024-09-23  (已测试)
 template <class... ArgsTypes>
 const _DListNodeIterator<T> std_emplace_front(ArgsTypes&&... args) {

     return this->_DListNodeIterator<T>(
         inseart_front(T(std::forward<ArgsTypes>(args)...)),
         this);         
 } 

 template <class... ArgsTypes>
 const _DListNodeIterator<T> emplace_front(ArgsTypes&&... args) {

     return std_emplace_front(args...);
 }


 /// <summary>
 /// 
 /// </summary>
 /// <typeparam name="..._Valty"></typeparam>
 /// <param name="..._Val"></param>
 /// <returns></returns>
 /// 创建时间: 2024-09-23      最后一次修改时间:2024-09-23  (已测试)
 template <class... ArgsTypes>
 const _DListNodeIterator<T> std_emplace_back(ArgsTypes&&... args) {

     return this->_DListNodeIterator<T>(
         inseart_back(T(std::forward<ArgsTypes>(args)...)),
         this);
 }

 template <class... ArgsTypes>
 const _DListNodeIterator<T> emplace_back(ArgsTypes&&... args) {

     return std_emplace_back(args...);
 }

 /// <summary>
 /// 包括array在内的每个顺序容器都有一个front成员函数,而除forward_list
 /// 之外的所有顺序容器都有一个back成员函数。这两个函操作分别返回函数首元
 /// 素和尾元素的引用
 ///  	在容器中访问元素的成员函数(即,front,back、下标和at)返回的都是引用。
 /// 如果容器是一个const对象,则返回值是const的引用。如果容器不是const的,则
 /// 返回值是普通引用,我们可以用来改变元素的值
 /// </summary>
 /// <returns></returns>
 /// 创建时间: 2024-09-25      最后一次修改时间:2024-09-25   
 inline const T& std_front()const {
     //标准库不做检查
     lassert(this->_Count > 0 && _Count != 0);

     return _First->Data;
 }

 inline T& std_front() {
     //标准库不做检查
     lassert(this->_Count > 0 && _Count != 0);

     return _First->Data;
 }

 inline const T& front()const { return std_front(); }
 inline  T& front() { return std_front(); }

 /// <summary>
 ///     包括array在内的每个顺序容器都有一个front成员函数,而除forward_list
 /// 之外的所有顺序容器都有一个back成员函数。这两个函操作分别返回函数首元
 /// 素和尾元素的引用
 ///  	在容器中访问元素的成员函数(即,front,back、下标和at)返回的都是引用。
 /// 如果容器是一个const对象,则返回值是const的引用。如果容器不是const的,则
 /// 返回值是普通引用,我们可以用来改变元素的值
 /// </summary>
 /// <returns></returns>
 /// 创建时间: 2024-09-25      最后一次修改时间:2024-09-25   
 inline const T& std_back()const {
     lassert(this->_Count > 0);
     return _Last->Data;
 }

 inline  T& std_back() {
     lassert(this->_Count > 0);
     return _Last->Data;
 }

 inline const T& back()const {  return std_back();}
 inline  T& back() { return std_back(); }

 /// <summary>
 /// 返回下标为n的元素的引用。如果下标越界,则抛出-out_of_range异常
 ///  	在容器中访问元素的成员函数(即,front,back、下标和at)返回的都是引用。
 /// 如果容器是一个const对象,则返回值是const的引用。如果容器不是const的,则
 /// 返回值是普通引用,我们可以用来改变元素的值
 /// </summary>
 /// <param name="nIndex"></param>
 /// <returns></returns>
 /// 创建时间: 2024-09-26      最后一次修改时间:2024-09-26   
 inline const T& std_at(const size_t& nIndex)const { return (*this)[nIndex]; }
 inline  T& std_at(const size_t& nIndex) { return (*this)[nIndex]; }

 inline const T& at(const size_t& nIndex)const { std_at(nIndex); }
 inline  T& at(const size_t& nIndex){ return std_at(nIndex); }

 /// <summary>
 /// 
 /// </summary>
 /// <returns></returns>
  /// 创建时间: 2024-09-25      最后一次修改时间:2024-09-25   
 inline bool std_empty() { return _Count == 0; }
 inline bool empty() { return std_empty(); }

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

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


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

 
 inline auto end()const { return std_end(); }

 inline _DListNodeReverseIterator<T>  std_rend()const {

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

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

      
 inline auto rend()const{  return std_rend(); }

完整代码:

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

作者				: 李锋

功能				: 链表

手机				: 13828778863

Email			:  ruizhilf@139.com


创建时间			: 2016年07月31日

最后一次修改时间	:  2024年09月26日


/// 链表是一种用来存储数据集合的数据结构。链表具有如下属性
///(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 std::deque<T>& d){
        InitData();
        for (const T& t : d)
        {
            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; }



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

    /// <summary>
    /// 重载的下标操作符 []
    /// </summary>
    const T& operator[](const size_t& nIndex) const {  return IndexOfNode(nIndex)->Data; }
    T& operator[](const size_t& nIndex) { 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>
    /// 返回下标为n的元素的引用。如果下标越界,则抛出-out_of_range异常
    /// </summary>
    /// 创建时间: ???-??-??      最后一次修改时间:2024-09-26  已测试
    inline virtual _DListNode<T>* IndexOfNode(const size_t& nPos)const
    {
        if (nPos >= _Count && _Count != 0 )
            throw ::std::out_of_range("下标越界!");

        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: //------------------------------------------------------------------重写


 
    /// <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 标准库

    
 
    //----------------------------------------------------------  C++
 

    inline void std_push_back(const T& tItem) { Add(tItem); }
    inline void push_back(const T& tItem) { std_push_back(tItem); }

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

    /// <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>
    /// boject.insert(p,t)	 boject.emplace(p, args)
    /// 在迭代器p指向的元素之前创建一个值为t或由args创建的元	素。
    /// 返回指向新添加的元素的迭代器
    /// </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);
    }


    /// <summary>
    /// boject.insert(p,t)	 boject.emplace(p, args)
    /// 在迭代器p指向的元素之前创建一个值为t或由args创建的元	素。
    /// 返回指向新添加的元素的迭代器
    /// </summary>
    /// <typeparam name="...args"></typeparam>
    /// <param name="it"></param>
    /// <param name="..._Val"></param>
    /// <returns></returns>
    template<class... ArgsTypes>
    inline _DListNodeIterator<T> std_emplace(const _DListNodeIterator<T>& it,
        ArgsTypes&&... args) {        
        return this->std_insert(it, T(std::forward<ArgsTypes>(args)...));
    }

    template<class... ArgsTypes>
    inline _DListNodeIterator<T> emplace(const _DListNodeIterator<T>& it,
        ArgsTypes&&... args) {
        return  std_emplace(it, args...);
    }


    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="..._Valty"></typeparam>
    /// <param name="..._Val"></param>
    /// <returns></returns>
    /// 创建时间: 2024-09-23      最后一次修改时间:2024-09-23  (已测试)
    template <class... ArgsTypes>
    const _DListNodeIterator<T> std_emplace_front(ArgsTypes&&... args) {

        return this->_DListNodeIterator<T>(
            inseart_front(T(std::forward<ArgsTypes>(args)...)),
            this);         
    } 

    template <class... ArgsTypes>
    const _DListNodeIterator<T> emplace_front(ArgsTypes&&... args) {

        return std_emplace_front(args...);
    }


    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="..._Valty"></typeparam>
    /// <param name="..._Val"></param>
    /// <returns></returns>
    /// 创建时间: 2024-09-23      最后一次修改时间:2024-09-23  (已测试)
    template <class... ArgsTypes>
    const _DListNodeIterator<T> std_emplace_back(ArgsTypes&&... args) {

        return this->_DListNodeIterator<T>(
            inseart_back(T(std::forward<ArgsTypes>(args)...)),
            this);
    }

    template <class... ArgsTypes>
    const _DListNodeIterator<T> emplace_back(ArgsTypes&&... args) {

        return std_emplace_back(args...);
    }

    /// <summary>
    /// 包括array在内的每个顺序容器都有一个front成员函数,而除forward_list
    /// 之外的所有顺序容器都有一个back成员函数。这两个函操作分别返回函数首元
    /// 素和尾元素的引用
    ///  	在容器中访问元素的成员函数(即,front,back、下标和at)返回的都是引用。
    /// 如果容器是一个const对象,则返回值是const的引用。如果容器不是const的,则
    /// 返回值是普通引用,我们可以用来改变元素的值
    /// </summary>
    /// <returns></returns>
    /// 创建时间: 2024-09-25      最后一次修改时间:2024-09-25   
    inline const T& std_front()const {
        //标准库不做检查
        lassert(this->_Count > 0 && _Count != 0);

        return _First->Data;
    }

    inline T& std_front() {
        //标准库不做检查
        lassert(this->_Count > 0 && _Count != 0);

        return _First->Data;
    }

    inline const T& front()const { return std_front(); }
    inline  T& front() { return std_front(); }

    /// <summary>
    ///     包括array在内的每个顺序容器都有一个front成员函数,而除forward_list
    /// 之外的所有顺序容器都有一个back成员函数。这两个函操作分别返回函数首元
    /// 素和尾元素的引用
    ///  	在容器中访问元素的成员函数(即,front,back、下标和at)返回的都是引用。
    /// 如果容器是一个const对象,则返回值是const的引用。如果容器不是const的,则
    /// 返回值是普通引用,我们可以用来改变元素的值
    /// </summary>
    /// <returns></returns>
    /// 创建时间: 2024-09-25      最后一次修改时间:2024-09-25   
    inline const T& std_back()const {
        lassert(this->_Count > 0);
        return _Last->Data;
    }

    inline  T& std_back() {
        lassert(this->_Count > 0);
        return _Last->Data;
    }

    inline const T& back()const {  return std_back();}
    inline  T& back() { return std_back(); }

    /// <summary>
    /// 返回下标为n的元素的引用。如果下标越界,则抛出-out_of_range异常
    ///  	在容器中访问元素的成员函数(即,front,back、下标和at)返回的都是引用。
    /// 如果容器是一个const对象,则返回值是const的引用。如果容器不是const的,则
    /// 返回值是普通引用,我们可以用来改变元素的值
    /// </summary>
    /// <param name="nIndex"></param>
    /// <returns></returns>
    /// 创建时间: 2024-09-26      最后一次修改时间:2024-09-26   
    inline const T& std_at(const size_t& nIndex)const { return (*this)[nIndex]; }
    inline  T& std_at(const size_t& nIndex) { return (*this)[nIndex]; }

    inline const T& at(const size_t& nIndex)const { std_at(nIndex); }
    inline  T& at(const size_t& nIndex){ return std_at(nIndex); }

    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
     /// 创建时间: 2024-09-25      最后一次修改时间:2024-09-25   
    inline bool std_empty() { return _Count == 0; }
    inline bool empty() { return std_empty(); }

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

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


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

 
    inline auto end()const { return std_end(); }

    inline _DListNodeReverseIterator<T>  std_rend()const {

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

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

         
    inline auto rend()const{  return std_rend(); }



}; //--------------------------------------------------------------------------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/2165775.html

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

相关文章

【笔记】Dynamic Taint Analysis 动态污点分析

Dynamic Taint Analysis 动态污点分析 什么是动态污点分析&#xff1f;为什么要搞动态污点分析&#xff1f; “污点”指的是什么&#xff1f; DTA中的“污点”指代的是不可信的输入&#xff0c;比如用户输入、网络请求、文件数据等。比方说&#xff0c;如果把程序看作一个城市&…

知识图谱检索 Graph-Based Retriever:文本块到结构化数据的转换,解决语义检索捕获不了的长尾关系

知识图谱检索 Graph-Based Retriever&#xff1a;文本块到结构化数据的转换&#xff0c;解决语义检索捕获不了的长尾关系 如何理解&#xff1f;如何分析&#xff1f;升维降维梳理为什么这种解法能查到长尾内容&#xff0c;而传统语义不行&#xff1f;解法拆解 如何关联&#xf…

大觅网之综合管理(Comprehensive Management of Da Mi Network)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

MySQL InnoDB 事务commit逻辑分析

一、前言 事务提交是事务即将落盘的一系列操作&#xff0c;涉及redo\undo log的写盘、bin log的写盘、事务状态的重置、各种参数的改变、无用undo log的清理等方方面面。 在commit过程会有两个阶段&#xff1a;一个是prepare阶段&#xff0c;入口函数为trx_prepare_low&#…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-25

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-25 1. PromSec: Prompt Optimization for Secure Generation of Functional Source Code with Large Language Models (LLMs) M Nazzal, I Khalil, A Khreishah, NH Phan - arXiv preprint arXiv:2409.12699, 2…

无人机探测:光电侦测技术详解

无人机探测技术作为现代军事、安防及民用领域的重要组成部分&#xff0c;其核心在于高效、精准地识别与跟踪空中目标。光电侦测技术&#xff0c;作为无人机探测的主要手段之一&#xff0c;利用光学与电子学原理&#xff0c;通过捕捉并分析无人机反射或发射的光信号&#xff0c;…

Debian与Ubuntu:深入解读两大Linux发行版的历史与联系

Debian与Ubuntu&#xff1a;深入解读两大Linux发行版的历史与联系 引言 在开源操作系统的领域中&#xff0c;Debian和Ubuntu是两款备受瞩目的Linux发行版。它们不仅在技术上有着密切的联系&#xff0c;而且各自的发展历程和理念也对开源社区产生了深远的影响。本文将详细介绍…

【C++指南】C++中的内存对齐规则及原因详解

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 目录 引言 一、为什么要进行内存对齐 二、C中的内存对齐规则 三、内存对齐示例讲解 示例代码 运行…

Spring Boot 进阶-第一个程序HelloWorld

从我们学习编程语言开始,每次入门一个语言都是从Hello World开始,当然这里我们也不例外。首先从一个简单的HelloWorld程序开始。 既然是要学着做Java Web开发,那么首先需要了解的就是如何去编写一个RESTFul风格的接口,这里我们就需要引入一个pom的依赖。 <dependency&g…

矩阵分析 学习笔记4 内积与Gram矩阵

内积 定义 由于对称&#xff0c;第二变元线性那第一变元也线性了。例如这个&#xff1a;

【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差

本文内容来自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7396959.html?templateId1718516 问题现象 yashandb执行带oracle dblink表的sql性能差&#xff1a; 同样的语句&#xff0c;同样的数据&#xff0c;oracle通过dblink访问远端oracle执行…

spring学习 【基础】

目录 1.将bean交给spring容器管理 1. 编写bean对象 2. 在resources目录下创建spring config xml文件&#xff0c;并管理bean对象 3. spring容器管理工厂 2.Spring Bean 生命周期 2.1 Spring Bean初始化方法 2.1.1 自定义初始化方法 2.1.2 实现接口(InitializingBean)…

Spring6梳理12——依赖注入之注入Map集合类型属性

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 12 依赖注入之注入Map集合类型属性 12.1 创建Student类和Teacher类 Student类中创建了run…

灵当CRM multipleUpload.php 文件上传致RCE漏洞复现

0x01 产品描述&#xff1a; 灵当CRM是一款专为中小企业量身定制的智能客户关系管理工具&#xff0c;由上海灵当信息科技有限公司开发和运营。该系统广泛应用于多个行业&#xff0c;包括金融、教育、医疗、IT服务及房地产等领域&#xff0c;旨在满足企业对客户个性化管理的需求&…

集合ArrayList常用方法

源代码&#xff1a; 输出结果&#xff1a;

小米Civi2机型工程固件 资源预览 刷写说明 与nv损坏去除电阻图示

小米Civi2机型机型代码为:ziyi。次期开始讲在博文中陆续解析机型nv损坏修复的一些步骤与当前机型去除校验电阻相关的图示与说明。注意。米系列机型有串码校验。去除电阻需要一定的技术,请谨慎操作。 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2�…

【计算机网络 - 基础问题】每日 3 题(二十四)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

音乐服务器测试报告

项目背景 该音乐服务器系统使用的是前后端分离的方式来实现,将相关数据存储到数据库中, 且将其部署到云服务器上. 前端主要构成部分有: 登录页面, 列表页面, 喜欢页面, 添加歌曲4个页面组成. 通过结合后端实现了主要的功能: 登录, 播放音乐, 添加音乐, 收藏音乐, 删除音乐, 删…

uniapp实现在表单中展示多个选项,并且用户可以选择其中的一个或多个选项

前言 uni-data-checkbox是uni-app的一个组件,用于在表单中展示多个选项,并且用户可以选择其中的一个或多个选项。该组件可以通过设置不同的参数来控制选项的样式、布局和行为。 提示:以下是本篇文章正文内容,下面案例可供参考 uni-data-checkbox组件具有以下特点:: 1、跨…

Git 工作区、暂存区与修改全解析

工作区和暂存区是 Git 中一个非常重要的概念&#xff0c;弄明白了他们&#xff0c;就弄明白了 Git 的很多操作到底干了什么。 ‍ 工作区&#xff08;Working Directory&#xff09; 工作区&#xff0c;就是一个目录&#xff0c;比如我的 LearnGit ​文件夹就是一个工作区&am…