C+中的二维字符串+; 我想在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"; }

C+中的二维字符串+; 我想在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"; },c++,stl,matrix,C++,Stl,Matrix,这给了我一个错误。为什么?怎么了?如何才能使其正常工作?谢谢。这个问题似乎暗示所需的数据结构是一组n行,每行包含m个字符。有两种方法可以考虑这一点——作为nxm字符矩阵,或者作为nm-字符向量(字符串与向量类似但不完全相同) 因此,似乎您不想要向量的向量的字符串的向量的s,您想要向量的向量的字符的向量的s,或者只想要字符串的向量的向量的 无论如何,在使用表[i] [j]或(稍微有点习惯性C++,但在这个例子中,由于代码> m < /c>和n>/c> >之前),必须使用适当的空间量,使用“代码>

这给了我一个错误。为什么?怎么了?如何才能使其正常工作?谢谢。

这个问题似乎暗示所需的数据结构是一组
n
行,每行包含
m
个字符。有两种方法可以考虑这一点——作为
nxm
字符矩阵,或者作为
n
m
-字符向量(字符串与
向量类似但不完全相同)

因此,似乎您不想要
向量的
向量的
字符串的
向量的
s,您想要
向量的
向量的
字符的
向量的
s,或者只想要
字符串的
向量的
向量的

无论如何,在使用表[i] [j]或(稍微有点习惯性C++,但在这个例子中,由于<>代码> m < /c>和n>/c> >之前),必须使用适当的空间量,使用“代码> PurthBuffe</代码>之类的东西来添加到结尾。


还要注意的是,
cin>>s
stdin
读取整行内容(我认为这使
向量
解决方案更容易处理)。

对尚未插入的向量进行索引是错误的

因此,举一个更简单的例子:

std::vector<int> v;
v[0] = 3;//bad, v[0] doesn't exist yet
std::vector v;
v[0]=3//糟糕,v[0]还不存在
正确:

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

但是在你的例子中,你首先要插入一个向量,然后把整个向量推到另一个向量中。

当你把新的东西插入一个
向量时,你不能只按索引分配-你需要使用
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);
    }
(i=0;is; 世界其他地区。向后推_(s); } 表。向后推(世界其他地区); }
必须创建元素向量,若要添加元素,必须使用
v.insert(v.end(),s)
和finnaly(当您有完整的行数据时)。必须编写
tables.insert(tables.end(),v)

我认为
向量
更适合您的目的。

您的
向量
仍然是空的,您可能不想这样做。您可以使用例如
push_back()
附加值,或者使用合适的大小初始化它们:

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

正如其他人提到的,
std::string
可能不是您真正需要的。
vector
类有一个接受大小和元素的ctor,因此:

vector< vector<char> > table(ROW_COUNT, vector<char>(COLUMN_COUNT, '.'));
vector表(行计数,向量(列计数,”);

将初始化一个向量,该向量包含作为第二个参数传递的向量的
行计数
副本,该向量包含
列计数

您需要使用
字符s;cin.get(s);
而不是
字符串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";
}
vector表格;
int m,n,i,j;
字符s;
cin>>n>>m;

对于(i=0;不一定),考虑电子表格中的网格/表格,每个单元中有一个公式。这是一个二维数组,但在这种情况下(即,从样本输入)。提问者似乎想要一个2d字符数组。问题不在于他不能用
向量逃脱惩罚--
cin>>的部分问题在于
cin>>一次要读一整行。如果他没有分词,他会在填写所有内容之前用完输入。同意;关于预分配或推回的要点是事实上更重要的是,尽管提问者没有真正理解正确的数据结构这一事实通常意味着模糊思维!…尽管
cin>>s
确实会在给定问题输入的情况下读取整行,但可能值得指出的是,它实际上只读取第一个空格字符r-即使在存在空白的情况下也可以读取一行,有一个全局的
std::getline
函数。查找出现问题的行的一种方法是使用
vector::at(size\u t)
而不是
vector::operator[]
,因为在访问无效索引时会引发异常。
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";
}