преобразование строк из карты в двумерный вектор - PullRequest
1 голос
/ 19 июня 2011

У меня есть массив строк, которые нужно взять на карту. Так как размер массива является переменным, мне нужен 2d вектор для получения строки символьно. Мне нужны оба формата хранения для операций, которые я выполняю над ними. Вот моя попытка .. дает ошибки в (EDIT:) во время выполнения.

#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 Ответ

2 голосов
/ 19 июня 2011

Похоже, проблема возникает после того, как вы распечатали карту, прежде чем скопировать строки в вектор.Вам нужны две вещи:

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 без разыменования, поскольку в цикле с двойной вложенностью вы ссылались на недопустимый итератор (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 символов, тогда как на самом деле его не будет.

...