Załadowanie do tablicy wektorów 2D, danych z wejścia standardowego.

0

Witam wszystkich serdecznie.

Programista ze mnie żaden więc mam następujący kłopot.

Potrzebuję ze standardowego wejścia wczytać dane. Następnie dane te potrzebuję upchać do tablicy wektorów 2D i nijak nie wiem jak to zrobić biedzę się nad tym od kilku godzin i nie mam zielonego pojęcia jak to ugryźć, żebym potem mógł sortować tą tablicę(sortowanie wierszy według liczb z dowolnej kolumny).

Przykład:

Plik liczby.txt ma następującą zawartość:

1 4 100
12 2 45
5 8 1

Po wykonaniu programu sortowanie.exe 2 < liczby.txt powinniśmy otrzymać wynik:

12 2 45
1 4 100
5 8 1

Liczba 2 mówi tutaj o numerze kolumny po której sortować będziemy.

Dane wczytuję w taki sposób:

while (getline(cin, linia, '\n'))

Numer kolumny wyławiam tak:

cout << argv[1]<< endl;

Macie jakiś pomysł jak to napisać?
Ewentualnie czy zamienić tablicę wektorów na coś innego ale jeśli tak to na co, bo wektory wydają mi się najsensowniejszą opcją.

Pozdrawiam,
Łukasz

0

plik wejściowy ma zawsze 3 kolumny? bo generalnie wczytujesz całą linię do stringa, którego trzeba by ew na liczby rozbić (a jak zawsze 3 to można by każdą do osobnej zmiennej w tablicy czy też strukturze wczytywać). poza tym cout wypisuje a nie wyłania, ale to już mniejszy problem.

0

Plik nie ma zdefiniowanej ilości kolumn i wierszy, jednak wiersze zawsze mają identyczną długość.

Wkleiłem całość, couta dałem żeby sprawdzić czy formuła wyciągająca numer kolumny działa, więc konkretnie tym się nie należy przejmować.

1
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <fstream>
using namespace std;

vector<string> split(const string& text)
{
    istringstream iss(text);
    vector<string> tokens;
    copy(
        istream_iterator<string>(iss),
        istream_iterator<string>(),
        back_inserter<vector<string>>(tokens)
    );
    return tokens;
}

vector<int> toInt(const vector<string>& src)
{
    vector<int> res(src.size());
    for(size_t i = 0; i < src.size(); ++i)
    {
        istringstream iss(src[i]);
        iss >> res[i];
    }
    return res;
}

int main()
{
    ifstream in("pliczek.txt");
    vector<vector<int>> matrix;
    string tmp;
    while(getline(in, tmp))
        matrix.push_back(toInt(split(tmp)));

    for(size_t i = 0; i < matrix.size(); ++i)
    {
        for(size_t j = 0; j < matrix[i].size(); ++j)
            cout << matrix[i][j] << " ";
        cout << "\n";
    }
    return 0;
}

Przykladowa implementacja moglaby wygladac chociazby tak. Splitujemy stringa, zapisujemy wszystkie tokeny do wektora stringow. Nastepnie zamieniamy wektor stringow na wektor intow i wrzucamy do wektora macierzy.

1

@n0name_l, WTF? czemu nie bezpośrednio?

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <fstream>
using namespace std;
 
vector<int> split(const string &text)
  {
   istringstream iss(text);
   vector<int> tokens;
   copy(istream_iterator<int>(iss),istream_iterator<int>(),back_inserter<vector<int> >(tokens));
   return tokens;
  }
 
int main()
  {
   ifstream in("pliczek.txt");
   vector<vector<int>> matrix;
   string tmp;
   while(getline(in,tmp)) matrix.push_back(split(tmp));
 
   for(size_t y=0;y<matrix.size();++y,cout<<endl)
     {
      for(size_t x= 0;x<matrix[y].size();++x) cout<<matrix[y][x]<<" ";
     }
   return 0;
  }
0

Szkoda że nie można ustawić 2 odpowiedzi jako akceptowalnych. Dziękuję za pomoc, dalej działam sam. Wynikami mojej pracy na pewno niedługo się podzielę.

Pozdrawiam
Łukasz

1 użytkowników online, w tym zalogowanych: 0, gości: 1