C++ 在C+中逐列迭代二维和三维向量+;11?

C++ 在C+中逐列迭代二维和三维向量+;11?,c++,c++11,vector,C++,C++11,Vector,我有一个二维和三维向量 using namespace std; vector< vector<int> > vec_2d; vector<vector<vector<int>>> vec_3d 使用名称空间std; 向量vec_2d; 向量向量机 我知道如何使用两个迭代器逐行迭代2D向量。第一个是“行”的迭代器,第二个是该“行”中“列”的迭代器。现在,我需要在2D向量上迭代,第一个迭代器成为“列”的迭代器,第二个迭代器成为该“列

我有一个二维和三维向量

using namespace std;

vector< vector<int> > vec_2d;
vector<vector<vector<int>>> vec_3d
使用名称空间std;
向量vec_2d;
向量向量机

我知道如何使用两个迭代器逐行迭代2D向量。第一个是“行”的迭代器,第二个是该“行”中“列”的迭代器。现在,我需要在2D向量上迭代,第一个迭代器成为“列”的迭代器,第二个迭代器成为该“列”中行的迭代器,即按列进行迭代。

使用迭代器,这将非常困难。我想你可能需要

如果您实际上不需要使用迭代器,并且确实有很好的理由希望以这种奇怪的方式遍历向量的向量(并且知道这将通过阻止缓存来减慢内存访问),那么可以使用索引轻松完成

下面是一个使用索引的示例,它处理了一个棘手的情况,即内部向量的长度不完全相同

using namespace std;

int main()
{
    vector< vector<int> > vec_2d = { {1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10} };

    bool is_col_out_of_bounds = false;
    for (size_t col=0; ! is_col_out_of_bounds; col++)
    {
        is_col_out_of_bounds = true;
        for (size_t row=0; row<vec_2d.size(); row++)
        {
            if (col < vec_2d[row].size())
            {
                is_col_out_of_bounds = false;
                cout << vec_2d[row][col] << endl;
            }
        }
    }

    return 0;
}

如果要保证所有行的长度相同,那么向量可能是更好的选择。

使用迭代器将非常困难。我想你可能需要

如果您实际上不需要使用迭代器,并且确实有很好的理由希望以这种奇怪的方式遍历向量的向量(并且知道这将通过阻止缓存来减慢内存访问),那么可以使用索引轻松完成

下面是一个使用索引的示例,它处理了一个棘手的情况,即内部向量的长度不完全相同

using namespace std;

int main()
{
    vector< vector<int> > vec_2d = { {1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10} };

    bool is_col_out_of_bounds = false;
    for (size_t col=0; ! is_col_out_of_bounds; col++)
    {
        is_col_out_of_bounds = true;
        for (size_t row=0; row<vec_2d.size(); row++)
        {
            if (col < vec_2d[row].size())
            {
                is_col_out_of_bounds = false;
                cout << vec_2d[row][col] << endl;
            }
        }
    }

    return 0;
}

如果您想保证所有行的长度相同,那么向量可能是更好的选择。

一个简单的答案:谁说您的布局应该按行解释?std::vector不知道行和列,所以让最外层的向量表示列而不是行


当打印到终端时,这是一个难题,很可能是按行进行的,但是如果在内部首选列布局,那么就这样做。

一个简单的答案:谁说您的布局应该按行进行解释?std::vector不知道行和列,所以让最外层的向量表示列而不是行


当打印到终端时,这是一个难题,可能是按行进行的,但是如果在内部首选列布局,那么就这样做。

只需使用索引。只需检查是否有更好的方法使用索引。根据我的经验,如果您有一个已索引的容器,迭代器的使用速度通常较慢,尤其是因为为了获取值而取消引用会增加开销。如果按列遍历2D数组,迭代器的开销将是最小的问题。即使使用索引,这种模式否定缓存的事实也会极大地降低内存访问速度。只需使用索引。只需检查是否有更好的方法使用索引。根据我的经验,如果您有一个已索引的容器,迭代器的使用通常较慢,特别是在取消引用之后,获取值,增加了开销。如果按列遍历2D数组,迭代器的开销将是最小的问题。即使使用索引,这种模式否定缓存的事实也会极大地降低内存访问速度。