Gå til innhold

sort() map<string, int>?


Anbefalte innlegg

Videoannonse
Annonse

Hirr. Det var deg, ja ;)

 

Må opp tidlig for å få gjort noe, vet du :) Selv om jeg er stor fan av And when wizards stay up late, new worlds are born så er det jo litt koselig å se dagslys innimellom også.

 

Filsystemet på root-partisjonen til mputt døde her en dag, så jeg installerte Ubuntu som en nødløsning. Har ikke giddet å sette opp sshd eller httpd ennå, men skal gjøre det når jeg får på plass Gentoo igjen. Hjemmeområdet ditt lever forresten fortsatt i beste velgående, så du kan ta det helt rolig på den fronten :)

 

Hvordan går det med kodingen?

Lenke til kommentar

heh.. bra det.. :p

Joda, jeg driver så vidt på.. Men har litt for lite tid om dagen. Tar seg nok opp fremover..

 

Har kommet i gang med Python også, men det er mere et sideprosjekt..

Men du..

 

1:

ofstream fout(fname.c_str());

 

Det tømmer også fila for alt innhold.. har jeg beklageligvis *oppdaga* :wallbash:

Hvordan forhindrer jeg det?

 

2:

    while (getline(fin, str)) {
         split(str, m);
   }

'fin' er file in ja.. og i split:

               typedef string::const_iterator iter;
              
              iter f_s = str.begin();
              f_s = find_if(f_s, str.end(), not_space);
              
              iter f_e = find_if(f_s, str.end(), space);
              iter s_s = find_if(f_e, str.end(), not_space);
              iter s_e = find_if(s_s, str.end(), space);
       
              m.insert(make_pair(string(f_s, f_e), string(s_s, s_e)));

Men map'et er jo map<int, std::string> så det vil jo ikke gå.. Hvordan skal jeg gjøre det? Ja, jeg vet det er litt shabby skrevet :whistle:

 

Ps. Likte Dev

Endret av J_lle
Lenke til kommentar

Det er ikke noe spesielt.. Det var bare en greie i boka at jeg skal gjøre forskjellige ting med store mengder data.. :D

 

fin er ifstream.. leser det med loopen og sender til split som deler hver linje (som består av et ord og et tall), og legger det inn som first og second i map<int, string>... og så får vi se hva som skjer.. men problemet er altså string(f_s, f_e) som ikke vil inn i first i map'et... Greia er at jeg ikke kan noen andre måter å inserte i et map.. noe det sikkert er...

:hmm:

Lenke til kommentar

Prøv med noe slik:

typedef string::const_iterator iter;
              
iter f_s = str.begin();
f_s = find_if(f_s, str.end(), not_space);
iter f_e = find_if(f_s, str.end(), space);

// Lag en int fra en std::string
stringstream ss;
ss << string(f_s, f_e);
int x;
ss >> x;

iter s_s = find_if(f_e, str.end(), not_space);
iter s_e = find_if(s_s, str.end(), space);

m.insert(make_pair(x, string(s_s, s_e)));

Lenke til kommentar

    ofstream fout(fname.c_str(), ios::out);    // dette er i main()
   for (map<int, string>::const_iterator it; it != m.end(); ++it) {
       fout << it->first << " " << it->second << endl;
   }

klikker når jeg kjører fila.. jeg la inn en if (m.empty()) i main og den var True så fingerer ikke denne?

void split(const string& str, map<int, string>& m)
{
              typedef string::const_iterator iter;
              
              iter f_s = str.begin();
              f_s = find_if(f_s, str.end(), not_space);
              
              iter f_e = find_if(f_s, str.end(), space);
              iter s_s = find_if(f_e, str.end(), not_space);
              iter s_e = find_if(s_s, str.end(), space);
              
              stringstream ss;
              ss << string(f_s, f_e);
              int x;
              ss >> x;
       
              m.insert(make_pair(x, string(s_s, s_e)));
}

Endret av J_lle
Lenke til kommentar
ofstream fout(fname.c_str(), ios::out);    // dette er i main()
for (map<int, string>::const_iterator it; it != m.end(); ++it) {
       fout << it->first << " " << it->second << endl;
}

klikker når jeg kjører fila..

 

Du må initialisere iteratoren din:

ofstream fout(fname.c_str(), ios::out); // dette er i main()

for (map<int, string>::const_iterator it = m.begin(); it != m.end(); ++it) {

// ...

 

 

jeg la inn en if (m.empty()) i main og den var True så fingerer ikke denne?

void split(const string& str, map<int, string>& m)
{
              typedef string::const_iterator iter;
              
              iter f_s = str.begin();
              f_s = find_if(f_s, str.end(), not_space);
              
              iter f_e = find_if(f_s, str.end(), space);
              iter s_s = find_if(f_e, str.end(), not_space);
              iter s_e = find_if(s_s, str.end(), space);
              
              stringstream ss;
              ss << string(f_s, f_e);
              int x;
              ss >> x;
       
              m.insert(make_pair(x, string(s_s, s_e)));
}

 

Det forstod jeg ikke helt. Hva er det du vil oppnå, og hva er det som gjør at det ikke fungerer? Du kan gjerne være litt mer raus med kodesnutter også ;)

Lenke til kommentar

uhm.. ja.. problemet er skrivinga til fila.. det her tenkte jeg skulle være enkelt, men haff.. paster like godt alt jeg :p

#include <fstream>
#include <string>
#include <map>
#include <iostream>
#include <iterator>
#include "split.h"

int main(int argc, char *argv[])
{
   using namespace std;
   
   string fname = argv[1];

   ifstream fin(fname.c_str(), ios::app);
   if (fin.bad())
      cerr << "Error: Unable to open input stream (" + fname + ")" << endl;

   map<int, string> m;
   string str;

   while (getline(fin, str)) {
         split(str, m);
   }
   
   ofstream fout(fname.c_str(), ios::out);
   for (map<int, string>::const_iterator it = m.begin(); it != m.end(); ++it) {
       fout << it->first << " " << it->second << endl;
   }

   return 0;
}

#include <string>
#include <map>
#include <sstream>

using namespace std;

bool space(char c)
{
    return isspace(c);
}
bool not_space(char c)
{
    return !isspace(c);
}
void split(const string& str, map<int, string>& m)
{
              typedef string::const_iterator iter;
              
              iter f_s = str.begin();
              f_s = find_if(f_s, str.end(), not_space);
              
              iter f_e = find_if(f_s, str.end(), space);
              iter s_s = find_if(f_e, str.end(), not_space);
              iter s_e = find_if(s_s, str.end(), space);
              
              stringstream ss;
              ss << string(f_s, f_e);
              int x;
              ss >> x;
       
              m.insert(make_pair(x, string(s_s, s_e)));
}

Endret av J_lle
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...