二维vector 的列迭代器使用

img

原意是想要用迭代器访问vector的数组,但是访问列迭代器时,查询其他博主要用 * 来访问,但是写了报错了,求解答。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7734534
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:读入一段文本到vector对象,每个单词存储为vector中的一个元素。把vector对象中的每个单词转化为大写字母。输出vector对象中转化后的元素。
  • 除此之外, 这篇博客: vector详解,迭代器的几种失效的情况中的 扩增倍数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • vs为1.5倍,即 0.5 倍扩增Capacity
    linux为2倍,即 1 倍扩增Capacity

  • 以下回答由chatgpt基于相关博客总结生成:

    在C++中,使用二维vector的列迭代器来访问其数组需要使用以下步骤:

    1. 首先要创建一个二维vector对象,并且初始化:
    vector<vector<int>> vec{ {1,2,3}, 
                             {4,5,6},
                             {7,8,9} };
    
    1. 最好使用auto关键字自动推导迭代器类型,并且通过循环访问每一列:
    for (auto it = vec[0].begin(); it != vec[0].end(); ++it) {
        cout << *it << endl;
    }
    

    这里以访问第一列为例,直接使用二维vector的下标运算符访问第一列,并使用begin()和end()函数获取该列的起始和终止迭代器。

    如果要访问所有列,则可以通过使用内层迭代器的advance函数,将外层迭代器向后移动一个元素。注意,在使用advance函数时,要先将迭代器类型指定为auto。

    for (auto it = vec[0].begin(); it != vec[0].end(); ++it) {
        for (auto inner = vec.begin(); inner != vec.end(); ++inner) {
            cout << *it << " ";
            advance(it, 1);
        }
        cout << endl;
    }
    

    这样就可以输出所有列了。同时还需注意,advance提供了协成迭代器递增的功能。

    虽然可以使用 * 运算符来访问二维vector中的元素,但是不建议这样使用。因为应该使用迭代器来访问vector中的元素,这样代码可读性更高,缩小了出错的概率。而且,一维vector中 * 运算符访问方式不同,这会给程序员带来混淆和不便。