C ++中的二维字符串

时间:2010-04-16 14:43:43

标签: c++ stl matrix

我想在C ++中编写类似2d字符串的内容。 我尝试过:

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 个答案:

答案 0 :(得分:7)

这个问题似乎暗示所需的数据结构是一组n行,每行m个字符。有两种方法可以考虑这一点 - 作为nxm字符矩阵,或作为n m - 字符向量(和字符串类似但不同于vector<char> )。

因此,您似乎不需要vector vectorstringvector的{​​{1}}个vector charvector {1}},或只是string m s。

无论如何,你必须在使用table [i] [j]之前分配适当的空间量或者(稍微更惯用的c ++,但在这种情况下不需要npush_back事先已知)使用类似cin>>s的东西添加到最后。

另请注意,stdinvector<string>读取整个(这使{{1}}解决方案更易于处理,我认为)。

答案 1 :(得分:4)

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 :(得分:2)

vector类有一个ctor,它取大小和元素,所以:

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

将初始化包含作为第二个参数传递的向量的ROW_COUNT个副本的向量,其中包含COLUMN_COUNT.

答案 3 :(得分:1)

索引尚未插入的矢量是错误的。

所以采取一个更简单的例子:

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

正确:

std::vector<int> v;
v.push_back(3);
int x = v[0];//ok

但在你的情况下,你首先插入一个向量,然后将整个向量推入另一个向量。

答案 4 :(得分:1)

我认为vector<vector<char> >更适合您的目的。

答案 5 :(得分:1)

vector仍然是空的,你可能不会这样做。你可以使用例如附加值来附加值push_back()或以合适的大小初始化它们:

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

正如其他人所说,std::string可能不是你真正需要的。

答案 6 :(得分:1)

您需要使用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";
}

答案 7 :(得分:0)

您必须创建元素向量,才能添加必须使用的元素v.insert(v.end(), s)。和finnaly(当你有完整的行数据)。你必须写tables.insert(tables.end(), v)