我有一个字符串数组需要被带入地图。由于数组大小是可变的,我需要一个2d向量来获得字符串字符串。我需要两种格式的存储来执行我对它们执行的操作。这是我的尝试......在(编辑:)运行时给出错误。
#include "stdafx.h"
#include<iostream>
#include<string>
#include<fstream>
#include<map>
#include<vector>
#include<algorithm>
#include<iterator>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
std::map<int,string>col;
std::map<int,string>row;
std::map<int,string>::iterator p;
std::map<int,string>d1;
std::map<int,string>d2;
int main()
{
int i=0,r=0;
string s;
ifstream ip;
ip.open("a.in");
ofstream op;
op.open("a_out.in");
ip>>s;
const int c= s.length();
ip.seekg(0,std::ios::beg);
do {
ip>>s;row.insert(make_pair(r,s));
r++;
}while(s.length()==c);
p=row.find(--r);
row.erase(p);
p = row.begin();
while(p!=row.end())
{
cout<<(p->first)<<","<<(p->second)<<"\n";
p++;
}
vector<vector<char>>matrix(r,vector<char>(c));
rep(i,0,r){
int k=0;rep(j,0,c)(p->second).copy(&matrix[i][j],1,k++);
}
rep(i,0,r)
rep(j,0,c)
cout<<matrix[i][j];
return 0;
}
答案 0 :(得分:2)
在将字符串复制到向量之前,看起来打印出地图后会出现问题。你需要两件事:
while(p!=row.end())
{
cout<<(p->first)<<","<<(p->second)<<"\n";
p++;
}
p = row.begin(); // Must reset iterator!
vector<vector<char>>matrix(r,vector<char>(c));
rep(i,0,r){
int k=0;
rep(j,0,c)(p->second).copy(&matrix[i][j],1,k++);
++p; // Must advance the iterator.
}
这应该修复map / set迭代器而不是dereferencable,就像在双重嵌套的for循环中引用了一个无效的迭代器(p被设置为row.end())。
编辑:
此外,除非您可以假设所有字符串的长度相同,否则您可能会考虑采用不同的技术。当您使用const int c = s.length()
时,您告诉map<int,string>
和vector<char>
文件中每个字符串的长度都是完全相同的长度。如果第二个字符串比第一个字符串短,您将尝试访问字符串中不存在的字符!注意
rep(j,0,c) (p->second).copy(&matrix[i][j],1,k++)
会失败,因为它认为它有c
个字符,而事实上它不会。