0

我正在创建一个vector<vector<char>>from 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] << " ";
        }
}
4

3 回答 3

1

要从数组初始化向量,您应该编写如下内容:

vector<char> v0(row0, row0 + 10);

与你所做的相反。我很惊讶这段代码甚至可以编译。可能您应该使用编译器选项来打印更多警告。

于 2013-05-21T06:39:29.233 回答
0

你的指数是错误的。结束迭代器应该指向数组末尾之后的一个(它应该是一个指针,而不是你目前拥有的值)。使用std::beginandstd::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 使用初始值设定项列表来构建它——它将节省大量样板代码。

于 2013-05-21T06:45:00.643 回答
0

有几种方法可以将数据推送到向量中。首先,恕我直言,最好的方法是使用 C++11统一初始化

std::vector<char> v0 = {'X', '-', '-', '-', '-', '-', '-', '-', '-', 'X'};
// etc.

第二种方法也是使用另一个 C++11 特性:std::beginstd::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... */ };
于 2013-05-21T06:43:10.830 回答