Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Динамический массив


Автор: SAndrus 31.8.2005, 07:45
В общем вопрос экономии ресурсов и времени.
хотелось, чтобы массив создаваемый при нахождении разделителя в строке его позиция добавлялась в массив, а не проходить эту строку несколько раз.
Не хотелось бы писать класс, как это делается знаю.

Автор: Mayk 31.8.2005, 08:02
Если я правильно понял вопрос(а я его вообще не понял), strtok тебе исходную строку на куски порежет и не будет проходить по одному и тому же участку строки несколько раз.

Автор: SAndrus 31.8.2005, 08:50
На примере:
Есть CString "*.doc;*.rtf" нужно преобразовать в две строки по символу ;
Конечно строк может быть и больше, поэтому хотелось, чтобы создавался массив строк
Функцию gettok не понял и ей нужен *char, а CString преобразовывает в const * char.
Нудно

Автор: Orlan 31.8.2005, 09:46
Цитата(SAndrus @ 31.8.2005, 07:45)

хотелось, чтобы массив создаваемый при нахождении разделителя в строке его позиция добавлялась в массив, а не проходить эту строку несколько раз.

Так надо сохранять позицию в std::vector<int>, например.
Цитата(SAndrus @ 31.8.2005, 08:50)

Есть CString "*.doc;*.rtf" нужно преобразовать в две строки по символу ;

Код

void split (const string& text, const string& separators, list<string> & words)
{
    int n     = text.length();
    int start = text.find_first_not_of(separators);

    while ((start >= 0) && (start < n))
    {
        int stop = text.find_first_of(separators, start);
        if ((stop < 0) || (stop > n)) stop = n;
        words.push_back (text.substr(start, stop-start));
        start = text.find_first_not_of(separators, stop+1);
    }
}
list<string> words;
split("*.doc;*.rtf", ";", words);

Вместо list возможно будет лучше использовать std::vector<T>

Автор: SAndrus 31.8.2005, 09:58
Понял, все уже изобретено.
Где можно найти информацию по объектам типа std и list

Автор: Orlan 31.8.2005, 10:06
Это STL (Standard Template Library, стандартная библиотека шаблонов)
std - названия пространства имен
list, vector - контейнеры
http://rsdn.ru/article/cpp/stl.xml
http://rsdn.ru/article/cpp/stl/sampl.xml
Советую все таки купить книжку по STL, а не просто почитать статьи в инете.

Автор: SAndrus 31.8.2005, 10:34
Спасибо
Почитаю если будет интересно но мало обязательно куплю книгу.

Автор: Eugene82 13.10.2005, 17:45
Ребята, а можно более подробнее описать как использовать приведённую здесь функцию split()?

Я хочу использовать свойство Mask объекта FilterComboBox для передачи списка масок/расширений в свою функцию поиска файлов по маске. Список естественно надо предварительно порезать.

Я совсем недавно начал изучать Builder, подскажите объявление функции split() должно находиться где-то в начале файла cpp или её можно объявлять непосредственно перед вызовом в обработчике событий?

Ещё. Вызов в моём случае должен выглядеть так?
Код

split(FilterComboBox1->Mask, ";", words);
И ещё, не пойму, а дальше как мне получить конкретное значение полученое в результате работы split()? Какие имена будут иметь элементы полученного массива строк?

Автор: Eugene82 17.10.2005, 19:21
Цитата(SAndrus @ 31.8.2005, 08:50)
Есть CString "*.doc;*.rtf" нужно преобразовать в две строки по символу ;
Конечно строк может быть и больше, поэтому хотелось, чтобы создавался массив строк
Цитата(SAndrus @ 31.8.2005, 07:45)
хотелось, чтобы массив создаваемый при нахождении разделителя в строке его позиция добавлялась в массив, а не проходить эту строку несколько раз.
Не дождавшись ответа в тему я разобрался во всём сам. И сделал немного по-другому. Признаю что не так красиво, но по-моему проще.
Код

#include <string>
#include <vector>
//по началу я вообще без них пытался работать со строками и был сильно обруган компилятором
using namespace std;//чуть не забыл про использование пространства имён!
string StrOfExt;//Переменная для строки расширений
StrOfExt=FilterComboBox->Mask.c_str();//Тип AnsiString в string напрямую не преобразовывается!
vector<string> Item;
Item.insert(Item.end(),StrOfExt);
int i=0,nWordEnd = Item[i].find(';');
while(nWordEnd>-1)// find() возвращает -1 если символ в строке не найден
{
Item.insert(Item.end(),Item[i].substr(nWordEnd+1));//записываем остаток строки чтобы не искать сначала!
//впоследствии он перезаписывается (кроме последнего - не содержащего искомых символов)
//после тестирования выяснил что забыл "+1" и начинал в строке поиск с искомого символа ...бесконечно
Item[i]=Item[i].substr(0,nWordEnd);//перезапись промежуточного значения конечным
i++;
nWordEnd = Item[i].find(';');//поиск в остатке строки
}
//всё! можно использовать элементы массива в своих нуждах
for(i=0;i<Item.size();i++)//Кстати, господа программеры, компилятор в этом месте предупреждает
//о сравнении знакового с беззнаковым! К чему бы это?
{
ShowMessage(Item[i].c_str());//для примера можно и так
}
Вот так вот! Хотел не тестировать, но не удержался чтобы не проверить себя - и правда - забыл "+1" в цикле... smile Но теперь код уже проверен. Присваивайте своё значение StrOfExt и меняйте ShowMessage() на необходимую вам функцию и готово!

Автор: DeadSoul 17.10.2005, 20:11
Цитата(Orlan @ 31.8.2005, 10:06)
Руководство по стандартной библиотеке шаблонов (STL)

крайне плохая книга.

Джосьютис "С++ Стандартная библиотека" - эта книга на 5+ smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)