Как конвертировать list в string[]?

Привет, обитатели тостера. Я только начал изучать C++. Я свободно работаю с ООП в PHP. Умею мыслить логически. Но понять си пока не могу.

Нужно мне отпарсить строку. Разбить ее на массив по разделителю (как explode в php). Нашел много обрывков кода. Пытаюсь собрать вместе. Но как же мне это сделать?

Код:
string* parse(string s, int sort = -1) {
	list<string> words;
	istringstream ist(s);
	string tmp;

	int i = 1;
	while (ist >> tmp) {
		words.push_back(tmp);
		i++;
	}

	string* string_array = new string[i];

	switch (sort) {
		case -1: // UNSORTED
			copy(words.begin(), words.end(), ostream_iterator<string>(cout, "\n"));
			break;

		case 0: // ASC
			words.sort();
			copy(words.begin(), words.end(), ostream_iterator<string>(cout, "\n"));
			break;

		case 1: // DESC
			words.sort(greater<string>());
			copy(words.begin(), words.end(), ostream_iterator<string>(cout, "\n"));
			break;
	}

	return string_array;
}


Код может разбить строку и вывести результат в консоль. А мне нужен результат в виде массива строк. 3 часа уже безрезультатно гуглю.

P.S. Если не трудно, объясните по русски, что такое iterator
  • Вопрос задан
  • 1130 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Итератор — это объект с семантикой указателя, который может указывать на N+1 точку в объекте.
5f40aef227644b9ca57224ffeb571a97.png
Раз он с семантикой указателя, у него есть операции «унарная звезда» и −> (разыменование и разыменование+взятие поля). Также у итератора есть операция ++ (сдвинуться на следующую позицию). Если это т.н. «однонаправленный итератор» — всё, больше ничего.

Также бывают т.н. двунаправленные итераторы (есть операция −−), и итераторы произвольного доступа (их можно свободно складывать с числами — ну совсем как указатели). В частности, у std::list итераторы двунаправленные.

У итераторов неопределённое поведение…
• при попытке выйти за начало или конец;
• при попытке разыменовать, если он смотрит на последнюю позицию (отмеченную как «конец»).

Конкретно о задаче.
1. std::vector предпочтительнее std::list.
2. Не нужно возвращать string*, хватает какого-нибудь контейнера (std::vector<std::string> или std::list<std::string>).
3. Если функциональности и скорости istringstream хватает, флаг в руки! Я бы написал по хардкору, с нуля. Вот мой код, выдранный из моего проекта, наверно, будет несложно переделать его в учебный.

void parseCommaList(
        const char *aStart,   // указатель на начало
        const char *aEnd,    // указатель на символ за концом
        char aComma,        // символ-разделитель
        bool aSkipEmpty,   // true, если пустые подстроки пропускать
        ProcParseCommaList aCallback,   // функция-нагрузка
        void *aData)   // этот параметр нужен, чтобы передавать какие хочешь данные в функцию-нагрузку, удаляй его смело!
{
    str::trim(aStart, aEnd);    // моя функция; пододвигает aStart вперёд и aEnd назад, убирая пробелы.
                                // Если удаление пробелов не нужно — удаляй! Если нужно — пиши сам.
    if (aStart == aEnd) return;
    const char *sstart = aStart;
    for (const char *p = aStart; p != aEnd; ++p)
    {
        if (*p != aComma) continue;
        const char *send = p;
        str::trim(sstart, send);   // то же самое, можно убрать
        if (p != sstart || !aSkipEmpty)
            aCallback(sstart, send, aData);    // замени на боевую нагрузку
        sstart = p + 1;
    }
    str::trim(sstart, aEnd);   // то же самое, можно убрать
    if (sstart != aEnd || !aSkipEmpty)
        aCallback(sstart, aEnd, aData);    // замени на боевую нагрузку
}


И, соответственно, версия для std::string.

inline void parseCommaList(
        const std::string &aIn,
        char aComma,
        bool aSkipEmpty,
        ProcParseCommaList aCallback,
        void *aData)
{
    parseCommaList(aIn.data(), aIn.data() + aIn.length(), aComma, aSkipEmpty,
            aCallback, aData);
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Olej
@Olej
инженер, программист, преподаватель
Если не трудно, объясните по русски, что такое iterator

Чтоб не влезать в дебри (чтоб у вас совсем голова кругом не пошла) можете считать итератор:
- это "что-то вроде" указателя на какой-то очередной элемент контейнера...
- для которого определены операции ++ и -- (сдвинуться влево и вправо ... ну, если это не реверсный итератор ;-))
- и для которого вы можете получить значение элемента контейнера, на котором стоит итератор i, выражениями: *i или i->

Для следующих 3-х часов гугленья вам достаточно...
Ответ написан
Комментировать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы