从数组错误初始化向量

时间:2013-05-21 06:36:08

标签: c++

我正在从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] << " ";
        }
}

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

有几种方法可以将数据推送到向量中。第一个,也就是恕我直言,最好的方法是使用C ++ 11 uniform initialization

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... */ };

答案 2 :(得分:0)

你的指数错了。结束迭代器应该指向一个过去数组的结尾(它应该是一个指针,而不是你当前拥有的值)。使用std::beginstd::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构建它 - 它将节省大量的样板代码。

相关问题