我想在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
.....#..............
.....#..............
.....#..............
.....#..............
######..............
.......###..........
.......#.#..........
.......###...#######
.............#.....#
.............#######
它给了我分段错误。为什么?怎么了 ?它应该怎么做才能正常工作?谢谢。
答案 0 :(得分:7)
这个问题似乎暗示所需的数据结构是一组n
行,每行m
个字符。有两种方法可以考虑这一点 - 作为nxm
字符矩阵,或作为n
m
- 字符向量(和字符串类似但不同于vector<char>
)。
因此,您似乎不需要vector
vector
个string
个vector
的{{1}}个vector
char
个vector
{1}},或只是string
m
s。
无论如何,你必须在使用table [i] [j]之前分配适当的空间量或者(稍微更惯用的c ++,但在这种情况下不需要n
和push_back
事先已知)使用类似cin>>s
的东西添加到最后。
另请注意,stdin
从vector<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)