【问题标题】:converting matrix to std::vector将矩阵转换为 std::vector
【发布时间】:2013-11-09 08:57:52
【问题描述】:

我有以下矩阵:

unsigned wins[8][3] = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 0, 3, 6 }, { 1, 4, 7 }, { 2, 5, 8 }, { 0, 4, 8 }, { 2, 4, 6 } };

如何将其转换为 std::vector?

【问题讨论】:

    标签: c++ arrays matrix stl stdvector


    【解决方案1】:

    您可以使用两个迭代器构造函数来实例化一个带有wins 中数据副本的向量:

    unsigned* start = &wins[0][0];
    std::vector<unsigned> vwins(start, start + (8 * 3));
    

    这依赖于指针算法、指针是迭代器这一事实,以及二维数组是连续块这一事实,本质上是具有智能索引的一维数组。

    【讨论】:

    • 你的意思是,unsigned _wins[8][3] = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 0, 3, 6 }, { 1, 4, 7 }, { 2, 5, 8 }, { 0, 4, 8 }, { 2, 4, 6 } }; std::vector&lt;unsigned&gt; wins (_wins, _wins + (8 * 3));
    • wins 衰减为 unsigned(*)[3]
    • 我在std::vector vwins&lt;unsigned&gt;(wins, wins + (8 * 3));收到error C2955: 'std::vector' : use of class template requires template argument list
    • 我收到更多错误:if (board[vwins[i][0]] != 0 &amp;&amp; board[vwins[i][0]] == board[vwins[i][1]] &amp;&amp; board[vwins[i][0]] == board[vwins[i][2]]) return board[vwins[i][2]]; 表达式必须具有指向对象的指针类型
    • @coderrio 这是因为您将向量索引为二维数组。您要求提供矢量。如果你需要一个向量向量,你应该要求它。也许你应该澄清你的问题。
    【解决方案2】:

    由于我不知道您是否需要 2D 矢量,我将处理 2D 情况,因为 juanchopanza 处理 1D 情况。 :) 如果您使用的是 C++11,那么您可以这样做:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        vector<vector<int>> wins = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 0, 3, 6 }, { 1, 4, 7 }, { 2, 5, 8 }, { 0, 4, 8 }, { 2, 4, 6 } };
        for(vector<int> & row : wins) {
            for(int &col : row) {
                cout << col << " ";
            }
            cout << endl;
        }
        return 0;
    }
    

    此示例使用 C++11 初始化器列表来创建类似的结构,也称为 wins。我还写了一个小代码来展示如何循环遍历它并以合理的顺序打印出来。

    希望这会有所帮助! :)

    【讨论】:

    • 谢谢。我在井字游戏中切换到矢量,但它无法正常工作。我的意思是,它问我是想玩第一个还是第二个,然后它说电脑移动并挂起。这是代码:pastebin.com/R94RRbz4我做错了什么吗?
    • 哈!从数组中的数字我知道这是井字游戏! :) 前几天刚自己写了一个井字游戏……让我看看……
    • 无论您遇到什么问题,都可能在您的极小极大代码中...我建议您在搜索中设置一个最大深度,看看是否有帮助。
    • 最大深度是什么意思?
    • 我只是说要注意minimax不要调用自己太多次。
    猜你喜欢
    • 1970-01-01
    • 2019-08-14
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    相关资源
    最近更新 更多