RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1061159
Accepted
Elvin
Elvin
Asked:2020-12-20 19:50:39 +0000 UTC2020-12-20 19:50:39 +0000 UTC 2020-12-20 19:50:39 +0000 UTC

为什么无法访问 MyIterator 字段?

  • 772

我正在写 map 中插入的第二个版本,除了插入的对之外,您还需要传递一个迭代器,也就是说,我编写了这样一个插入的类似物:

std::map<char,int>::iterator it = mymap.begin();
  mymap.insert (it, std::pair<char,int>('b',300));  // max efficiency inserting
  mymap.insert (it, std::pair<char,int>('c',400));  // no max efficiency inserting

在这个 STL 示例中,我不明白他们为什么传递一个迭代器并将其称为高效插入。迭代器将遍历这些值,直到找到正确的对。什么是有效的?

template<class T,class R>
class Map 
{


public:
    Map();
    ~Map();
    R& operator[](T index)
    {
        return tree.searchOperator(index);
    }
    class MyIterator : public iterator<bidirectional_iterator_tag, RBTNode<T, R>>
    {
        friend class Map;
        public:
        MyIterator(RBTNode<T, R> *it)
        {
            second = it->Element.second;
            first = it->Element.first;
            temp = it;
        }
        MyIterator()
        {

        }
        MyIterator& operator=(const MyIterator& it) 
        {
            first = it.first;
            second = it.second;
            temp = it.temp;
            return (*this);
        }
        MyIterator& operator*()
        {

            return (*this);
        }
        MyIterator(const MyIterator& source)
        {
            first = source.first;
            second = source.second;
            temp = source.temp;
            /*temp->left = source.temp->left;
            temp->right = source.temp->right;
            temp->parent = source.temp->parent;
            temp->Element.first = source.temp->Element.first;
            temp->Element.second = source.temp->Element.second;
            temp->color = source.temp->color;*/
        }

        MyIterator operator++(int) 
        {//Post ++
            int j = 0;
            if (temp->right != NULL)
            {
                temp = temp->right;
            }
            if (temp->parent != NULL)//если root
            {
                temp = temp->parent;
            }


            first = temp->Element.first;
            second = temp->Element.second;
            return *this;
        }
        MyIterator *operator->() 
        {
            // 
            return (this);
        }

    public:
        T first;
        R second;
    private:
        RBTNode<T, R>* temp;
    };
    MyIterator begin()
    {
        RBTNode<T, R>* pt = tree.f_begin();
        MyIterator temp(pt);

        return temp;
    }
    pair<MyIterator, bool> insert(const std::pair<T,R> tempo)// first insert function
    {
        std::pair<MyIterator, bool> returnable;
        if (!tree.search(tempo.first))// проверка на уникальность
        {
            //RBTNode<T, R> tempnode;

            tree.insert(tempo.first, tempo.second);
            MyIterator ret(tree.search(tempo.first));//конструктор,чтобы знать ноду
            returnable.first = ret;
            returnable.second = 1;
            return returnable;
        }
        else 
        {
            MyIterator ret(tree.search(tempo.first));//конструктор,чтобы знать ноду
            returnable.first = ret;
            returnable.second = 0;
            return returnable;
        }


        //return ret;
    }

    MyIterator insert(MyIterator& it,  const std::pair<T, R> tempo)//second insertation function
    {


    }

private:
      RBTree<T,R> tree;

    //RBTNode<T, R> tempnode;
};

template <class T,class R>
Map<T, R>::Map() {


}
template <class T, class R>
Map<T,R>::~Map()
{

}

出于某种原因,我在此功能中无法使用 it 字段。如何使它们可用?

MyIterator insert(MyIterator& it,  const std::pair<T, R> tempo)//second insertation function
        {


              it-> // не работает, хоть и оператор -> перегружен
              it. // не работает доступ к полям(хотя бы public first и second)

        }
c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    232_159
    2020-12-21T21:29:02Z2020-12-21T21:29:02Z

    俄罗斯文档链接:https ://ru.cppreference.com/w/cpp/container/map/insert

    我们看3-4超载

    复杂

    3-4) 如果插入出现在提示之后的位置,则为摊销常数。否则,它与容器大小成对数。(最高 C++11)

    3-4) 如果插入出现在提示之前的位置,则为摊销常数。否则,它与容器大小成对数。

    事实证明,如果您知道将插入元素的位置,这种使用将是有效的。

    现在关于不可用:

    MyIterator insert(MyIterator& it,  const std::pair<T, R> tempo)
            {
    
    
                  it-> // не работает, хоть и оператор -> перегружен
                  it. // не работает доступ к полям(хотя бы public first и second)
    
            }
    

    你从哪里得到的,没有访问权限。有访问权限,一切都应该正常工作。我的猜测是 IntelliSense 只是不会“提示”您输入这些字段。这是由于 MyIterator 类的样板。如果您手动编写 - 一切都会奏效。

    • 1

相关问题

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5