• vector的坑——C++primer练习6.33总结


      说来惭愧,一道简单的对vector递归的题目写了一个多小时,最后还是请教了大神才改出来。

      首先贴上原代码:

    void return_vector(vector<int>::iterator,vector<int>);
    int main()
    {
        int n, temp;
        vector<int> symbol{};
        cin >> n;
        for (int i = 0; i < n; ++i)
        {
            cin >> temp;
            symbol.push_back(temp);
        }
        return_vector(symbol.end(), symbol);
        system("pause");
        return 0;
    }
    void return_vector(vector<int>::iterator ptr,vector<int> a)
    {
        if (ptr != a.begin()) return_vector(ptr - 1, a);
        cout << *ptr << endl;
    }

    结果提示错误:vector iterators incompatible!

    然后调试了一下,用非递归形式模拟这个过程:

    for (auto i = symbol.end();i != symbol.begin(); i = i - 1)
            cout << *i << endl;

    依然提示该错误,调试发现是对end()函数理解有误,C++Primer中写到:end()返回vector最后一个元素的下一个位置。

    改之:

    for (auto i = symbol.end()-1;i != symbol.begin(); i = i - 1)
            cout << *i << endl;

    测试通过!

    改正之前代码,运行,依然报同一个错误。

    继续调试,发现是在

    if (ptr != a.begin()) return_vector(ptr - 1, a);

    这一句中的!=出现错误(F11跟到了!=的重载的位置),但不知道具体哪儿出错。

    大神帮我看了下变量的地址,发现a.begin()和ptr的指向的地址不相同,遂想到是否因为是传入的是形参,导致函数中的vector<int> a 和main中定义的 vector<int> symbol并不是同一个vector,而a是symbol的一个拷贝?

    于是将函数改成传入symbol的引用:

    void return_vector(vector<int>::iterator,vector<int>&);
    int main()
    {
        int n, temp;
        vector<int> symbol{};
        cin >> n;
        for (int i = 0; i < n; ++i)
        {
            cin >> temp;
            symbol.push_back(temp);
        }
        return_vector(symbol.end() - 1, symbol);
        //for (auto i = symbol.end()-1;i != symbol.begin(); i = i - 1)
        //    cout << *i << endl;
        system("pause");
        return 0;
    }
    void return_vector(vector<int>::iterator ptr,vector<int>& a)
    {
        if (ptr != a.begin()) return_vector(ptr - 1, a);
        cout << *ptr << endl;
    }

    测试,通过!

    总结:

    1.在对传入的vector或者数组等参数没有改变的时候,最好使用引用,这样一些指针依然存在意义,而且不容易出错。

    2.end()函数指向的是容器的最后一个元素的下一个位置,切不可直接对XXX.end()直接解引用。

    3.由是想到函数参数的一些问题:何时传入引用,何时传入指针?二者的优劣(如果有的话)?什么时候应该使用const,什么时候不行?这些都还需要细细理解。

  • 相关阅读:
    图的建立的两种方法(领接矩阵,领接表)
    蛇形填数
    谁买单,猴子选大王等类似题目不同解法!!!
    根据前序中序写后序(正确写法)
    月份牌
    子网掩码
    android 之 surfaceView和普通View的重绘使用
    android 之 Toast通知的使用
    viewSub惰性装载器
    对文件进行加密
  • 原文地址:https://www.cnblogs.com/kangyun/p/4442871.html
Copyright © 2020-2023  润新知