Konwersja danych w vectorze

0

Witam, mam do napisania program konsolowy, który ma przyjmować z klawiatury jako wejście ciąg liczb naturalnych o nieznanej długości w następującym formacie: "LICZBA1, LICZBA2, LICZBA3, ...," np. 52, 1, 4, 2, ... Następnie program ma sortować liczby w kolejności niemalejącej za pomocą quicksorta. Do zapisu liczb należy użyć klasy vector.

Przechodząc do sedna, mam napisany już program, wszystko ładnie się kompiluje, tylko wynik jest nie taki na jaki liczyłem.
Problem na pewno leży w miejscu, gdzie chcę zrobić konwersję string na int, nie wiem natomiast jak ten problem rozwiązać.
Mógłby ktoś w jakiś pomóc, dać wskazówkę co zrobić, żeby wszystkie wpisane przez użytkownika dane konwertowały się i zapisywały do vectora liczby?

Oto jak działa program:
**Wprowadź znaki: ** 52, 1, 4, 2
Wczytane znaki to: 52, 52, 52, 52
Posortowane znaki: 52, 52, 52, 52

#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <sstream>


using namespace std;

void quicksort(vector <int>&, int, int);
int podzial(vector <int>&, int, int);

vector<string> dzielenie_stringa(string str, char delimiter)
{
	vector<string> pomocniczy; // wektor pomocniczy, tworzony na potrzeby dzielenia podzielenia stringa na znaki
	stringstream ss(str);
	string tok;
	while (getline(ss, tok, delimiter))
	{
		pomocniczy.push_back(tok);
	}
	return pomocniczy;

}

int main()
{

	string znaki;  // obiekt znaków
	cout << "Wprowadź znaki: ";
	getline(cin, znaki);
	vector <string> dane = dzielenie_stringa(znaki, ','); // klasa vector przechowywująca oddzielone już znaki ze stringa
	vector<int> liczby; // klasa vector przechowująca dane w postaci liczbowej 
        
       for (int i = 0; i < dane.size(); i++) // Konwersja string na int
	{
		int j = atoi(znaki.c_str());
		liczby.push_back(j);
	}

	cout << "Wczytane liczby to:  ";
	for (int i = 0; i < dane.size(); i++)
	{
		cout << liczby[i] << ", ";
	}
	cout << endl;
	
	quicksort(liczby, 0, liczby.size()-1);

	cout << "Posortowane liczby: ";
	for (int i = 0; i < liczby.size(); i++)
	{
		cout << liczby[i] << ", ";
	}
	getchar();
	return 0;
}


void quicksort(vector<int> & liczby, int p, int r) // sortowanie szybkie
{
	int q;
	if (p < r)
	{
		q = podzial( liczby, p, r); // dzielimy vector na dwie czesci, q oznacza punkt podzialu, 
		quicksort( liczby, p, q); // wywolujemy rekurencyjnie quickstort dla pierwszej czesci vectora
		quicksort( liczby, q + 1, r); // wywolujemy rekurencyjnie quicksort dla drugiej czesci tablicy

	}
}
int podzial(vector<int> & liczby, int p, int r) // podzielenie tablicy na dwie części, w pierwszej wszystkie liczby są mniejsze/równe x, w drugiej większe/równe x 
{
	int x = liczby[p]; // wybranie x 
	int i = p; // i, j - indeksy w vectorze
	int j = r;
	int w; 
	while (true) // pętla nieskonczona, wychodzimy z niej tylko przez return j
	{
		while (liczby[j] > x) // dopóki elemenenty są większe od x
			j--;
		while (liczby[i] < x) // dopóki elementy są mniejsze do x 
			i++;
		if (i < j) // zamieniamy miejscami, gdy i < j
		{
			w = liczby[i];
			liczby[i] = liczby[j];
			liczby[j] = w;
			i++;
			j--;
		}
		else // gdy i >=j zwracamy j jako punkt podzialu vectora
			return j;
	}

}
1

int j = std::stoi(dane[i]);

0

Tak czułem, że rozwiązanie jest prostsze niż myślałem. Dzięki wielkie!

0
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;

int main() {
	vector<int> numbers;
	copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(numbers));
	sort(numbers.begin(), numbers.end());
	copy(numbers.begin(), numbers.end(), ostream_iterator<int>(cout, " "));
	return 0;
}

Ja bym wyszedł z czegoś takiego jednak ;) (to nie gotowiec bo nie wczyta twojego formatu!)

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