Двумерные строки в C ++ - PullRequest
       7

Двумерные строки в C ++

3 голосов
/ 16 апреля 2010

Я хочу написать что-то вроде 2d строк в C ++. Я пробовал с:

vector< vector<string> > table;
        int m,n,i,j;
        string s;
        cin>>n>>m;
        for(i=0;i<n;i++) {
                for(j=0;j<m;j++) {
                        cin>>s;
                        table[i][j] = s;
                }
        }
        cout << "\n\n\n\n";
        for(i=0;i<n;i++) {
                for(j=0;j<m;j++) {
                        cout<<table[i][j]<<" ";
                }
                cout<<"\n";
        }

нет ошибок компиляции, но когда я ввожу ввод как:

10 20
.....#..............
.....#..............
.....#..............
.....#..............
######..............
.......###..........
.......#.#..........
.......###...#######
.............#.....#
.............#######

Это дает мне ошибку сегментации. Зачем ? В чем дело ? И как это сделать, чтобы оно работало правильно? Спасибо.

Ответы [ 8 ]

7 голосов
/ 16 апреля 2010

Вопрос, по-видимому, подразумевает, что необходимая структура данных представляет собой набор из n строк по m символов в каждой. Есть два способа думать об этом - как nxm матрица символов или как n m -характеры (и строка похожа, но не идентична vector<char>).

Так что, похоже, вам не нужны vector из vector с string с, вам нужно либо vector из vector с char с, либо просто vector string с.

В любом случае вы должны выделить соответствующее количество места перед использованием таблицы [i] [j] или (немного более идиоматически, c ++, но в этом случае нет необходимости, поскольку m и n известны заранее) используйте что-то вроде push_back, чтобы добавить в конец.

Обратите также внимание, что cin>>s читает целую строку из stdin (что, как мне кажется, с решением vector<string> немного легче иметь дело).

4 голосов
/ 16 апреля 2010

Вставляя что-то новое в vector, вы не можете просто распределить по индексу - вам нужно использовать метод push_back или что-то подобное.

    for(i=0;i<n;i++) {
            vector<string> row;
            for(j=0;j<m;j++) {
                    cin>>s;
                    row.push_back(s);
            }
            table.push_back(row);
    }
2 голосов
/ 16 апреля 2010

Класс vector имеет ctor, который принимает размер и элемент, поэтому:

vector< vector<char> > table(ROW_COUNT, vector<char>(COLUMN_COUNT, '.'));

инициализирует вектор, содержащий ROW_COUNT копий вектора, переданного в качестве второго аргумента, который содержит COLUMN_COUNT раз ..

1 голос
/ 16 апреля 2010

Вам нужно использовать char s; cin.get(s); вместо string s; cin>>s;, потому что cin>>s будет читать целое слово (в вашем примере это эквивалентно целой строке) за раз.

Кроме того, вам нужно что-то сделать, чтобы получить правильный размер каждого массива. В вашем коде у вас есть вектор 0 векторов 0 строк. Например:

vector< vector<string> > table;
int m,n,i,j;
char s;
cin>>n>>m;
for(i=0;i<n;i++) {
    table.push_back(vector<string>());
        for(j=0;j<m;j++) {
                cin.get(s);
                table[i].push_back(string(1,s));
        }
}
cout << "\n\n\n\n";
for(i=0;i<n;i++) {
        for(j=0;j<m;j++) {
                cout<<table[i][j]<<" ";
        }
        cout<<"\n";
}
1 голос
/ 16 апреля 2010

Вы vector все еще пусты, и вы, вероятно, не хотите. Вы можете добавить значения, используя, например, push_back() или инициализируйте их подходящим размером:

std::cin >> n >> m;
typedef std::vector<std::string> StringVec;
std::vector<StringVec> table(n, StringVec(m));

Как уже упоминалось, std::string может быть не то, что вам действительно нужно.

1 голос
/ 16 апреля 2010

Я думаю, vector<vector<char> > лучше подойдет для ваших целей.

1 голос
/ 16 апреля 2010

Ошибка индексировать вектор, в который вы еще не вставили.

Итак, приведем более простой пример:

std::vector<int> v;
v[0] = 3;//bad, v[0] doesn't exist yet

Правильно:

* +1007 *

Но в вашем случае вы сначала вставляете в вектор, а затем помещаете весь вектор в другой вектор.

0 голосов
/ 16 апреля 2010

Вы должны создать вектор элементов, для добавления элементов необходимо использовать v.insert(v.end(), s). и finnaly (когда у вас есть полные данные строки). Вы должны написать tables.insert(tables.end(), v)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...