将字符串从地图转换为2d矢量字符

时间:2011-06-19 14:46:20

标签: c++ vector maps stringstream

我有一个字符串数组需要被带入地图。由于数组大小是可变的,我需要一个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;
}

1 个答案:

答案 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个字符,而事实上它不会。