【发布时间】: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
我有以下矩阵:
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
您可以使用两个迭代器构造函数来实例化一个带有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<unsigned> wins (_wins, _wins + (8 * 3));?
wins 衰减为 unsigned(*)[3]。
std::vector vwins<unsigned>(wins, wins + (8 * 3));收到error C2955: 'std::vector' : use of class template requires template argument list
if (board[vwins[i][0]] != 0 && board[vwins[i][0]] == board[vwins[i][1]] && board[vwins[i][0]] == board[vwins[i][2]]) return board[vwins[i][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。我还写了一个小代码来展示如何循环遍历它并以合理的顺序打印出来。
希望这会有所帮助! :)
【讨论】:
minimax不要调用自己太多次。