我正在从char数组创建vector<vector<char>>
,如下所示:
typedef vector<vector<char>> board;
...
char row0[] = {'X', '-', '-', '-', '-', '-', '-', '-', '-', 'X'};
char row1[] = {'-', 'X', '-', '-', '-', '-', '-', '-', 'X', '-'};
char row2[] = {'-', '-', 'X', '-', '-', '-', '-', 'X', '-', '-'};
char row3[] = {'-', '-', '-', 'X', '-', '-', 'X', '-', '-', '-'};
char row4[] = {'-', '-', '-', '-', 'X', 'X', '-', '-', '-', '-'};
char row5[] = {'-', '-', '-', '-', 'X', 'X', '-', '-', '-', '-'};
char row6[] = {'-', '-', '-', 'X', '-', '-', 'X', '-', '-', '-'};
char row7[] = {'-', '-', 'X', '-', '-', '-', '-', 'X', '-', '-'};
char row8[] = {'-', 'X', '-', '-', '-', '-', '-', '-', 'X', '-'};
char row9[] = {'X', '-', '-', '-', '-', '-', '-', '-', '-', 'X'};
vector<char> v0(row0[0], row0[9]);
vector<char> v1(row1[0], row1[9]);
vector<char> v2(row2[0], row2[9]);
vector<char> v3(row3[0], row3[9]);
vector<char> v4(row4[0], row4[9]);
vector<char> v5(row5[0], row5[9]);
vector<char> v6(row6[0], row6[9]);
vector<char> v7(row7[0], row7[9]);
vector<char> v8(row8[0], row8[9]);
vector<char> v9(row9[0], row9[9]);
board test;
test.push_back(v0);
test.push_back(v1);
test.push_back(v2);
test.push_back(v3);
test.push_back(v4);
test.push_back(v5);
test.push_back(v6);
test.push_back(v7);
test.push_back(v8);
test.push_back(v9);
这样做之后,我希望看到印刷板看起来像原始的char数组。 但是,它的打印方式如下:
X X X X X X X X X X
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
X X X X X X X X X X
我哪里错了?
编辑:这是我打印电路板的方式: void printBoard(Board b){
for (int r = 0; r <10; r++){
cout << "\n";
for (int c = 0; c <10; c++){
cout << b[r][c] << " ";
}
}
答案 0 :(得分:1)
要从数组初始化向量,您应该编写如下内容:
vector<char> v0(row0, row0 + 10);
与你所做的相反。我很惊讶这段代码甚至编译。您可能应该使用编译器选项来打印更多警告。
答案 1 :(得分:0)
有几种方法可以将数据推送到向量中。第一个,也就是恕我直言,最好的方法是使用C ++ 11 uniform initialization:
std::vector<char> v0 = {'X', '-', '-', '-', '-', '-', '-', '-', '-', 'X'};
// etc.
第二种方法是使用另一种C ++ 11功能:std::begin
和std::end
:
std::vector<char> v0(std::begin(row0), std::end(row0));
第三种方法,以及在C ++ 11之前处理数组“迭代器”的方法是使用指向数组的指针:
std::vector<char> v0(static_cast<char*>(row0), static_cast<char*>(row0 + 10));
请注意,我在最后添加了10
,这是因为最后一个迭代器实际上是超出最后一个条目的迭代器。
顺便说一下,如果你有统一的位置,你也可以这样初始化电路板:
board test = { v0, v2, /* etc... */ };
答案 2 :(得分:0)
你的指数错了。结束迭代器应该指向一个过去数组的结尾(它应该是一个指针,而不是你当前拥有的值)。使用std::begin
和std::end
可确保您不会出错。
#include <vector>
#include <iostream>
#include <iterator>
using namespace std;
typedef vector<vector<char>> board;
void print_board(const board& b)
{
for(const auto& inner : b) {
for(auto c : inner) {
std::cout << c << " ";
}
std::cout << "\n";
}
}
int main()
{
char row0[] = {'X', '-', '-', '-', '-', '-', '-', '-', '-', 'X'};
char row1[] = {'-', 'X', '-', '-', '-', '-', '-', '-', 'X', '-'};
char row2[] = {'-', '-', 'X', '-', '-', '-', '-', 'X', '-', '-'};
char row3[] = {'-', '-', '-', 'X', '-', '-', 'X', '-', '-', '-'};
char row4[] = {'-', '-', '-', '-', 'X', 'X', '-', '-', '-', '-'};
char row5[] = {'-', '-', '-', '-', 'X', 'X', '-', '-', '-', '-'};
char row6[] = {'-', '-', '-', 'X', '-', '-', 'X', '-', '-', '-'};
char row7[] = {'-', '-', 'X', '-', '-', '-', '-', 'X', '-', '-'};
char row8[] = {'-', 'X', '-', '-', '-', '-', '-', '-', 'X', '-'};
char row9[] = {'X', '-', '-', '-', '-', '-', '-', '-', '-', 'X'};
vector<char> v0(std::begin(row0), std::end(row0));
vector<char> v1(std::begin(row1), std::end(row1));
vector<char> v2(std::begin(row2), std::end(row2));
vector<char> v3(std::begin(row3), std::end(row3));
vector<char> v4(std::begin(row4), std::end(row4));
vector<char> v5(std::begin(row5), std::end(row5));
vector<char> v6(std::begin(row6), std::end(row6));
vector<char> v7(std::begin(row7), std::end(row7));
vector<char> v8(std::begin(row8), std::end(row8));
vector<char> v9(std::begin(row9), std::end(row9));
board test;
test.push_back(v0);
test.push_back(v1);
test.push_back(v2);
test.push_back(v3);
test.push_back(v4);
test.push_back(v5);
test.push_back(v6);
test.push_back(v7);
test.push_back(v8);
test.push_back(v9);
print_board(test);
}
当然,您可以(并且应该)使用初始化程序列表使用C ++ 11构建它 - 它将节省大量的样板代码。