Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический массив, Что-то вроде vb ReDim Preserve 
:(
    Опции темы
SAndrus
Дата 31.8.2005, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 25.8.2005

Репутация: нет
Всего: нет



В общем вопрос экономии ресурсов и времени.
хотелось, чтобы массив создаваемый при нахождении разделителя в строке его позиция добавлялась в массив, а не проходить эту строку несколько раз.
Не хотелось бы писать класс, как это делается знаю.
PM MAIL   Вверх
Mayk
Дата 31.8.2005, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



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


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
SAndrus
Дата 31.8.2005, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 25.8.2005

Репутация: нет
Всего: нет



На примере:
Есть CString "*.doc;*.rtf" нужно преобразовать в две строки по символу ;
Конечно строк может быть и больше, поэтому хотелось, чтобы создавался массив строк
Функцию gettok не понял и ей нужен *char, а CString преобразовывает в const * char.
Нудно
PM MAIL   Вверх
Orlan
  Дата 31.8.2005, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Цитата(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>
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
SAndrus
Дата 31.8.2005, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 25.8.2005

Репутация: нет
Всего: нет



Понял, все уже изобретено.
Где можно найти информацию по объектам типа std и list
PM MAIL   Вверх
Orlan
  Дата 31.8.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Это STL (Standard Template Library, стандартная библиотека шаблонов)
std - названия пространства имен
list, vector - контейнеры
Руководство по стандартной библиотеке шаблонов (STL)
Примеры программ с шаблонами
Советую все таки купить книжку по STL, а не просто почитать статьи в инете.

--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
SAndrus
Дата 31.8.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 25.8.2005

Репутация: нет
Всего: нет



Спасибо
Почитаю если будет интересно но мало обязательно куплю книгу.
PM MAIL   Вверх
Eugene82
  Дата 13.10.2005, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



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

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

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

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

split(FilterComboBox1->Mask, ";", words);
И ещё, не пойму, а дальше как мне получить конкретное значение полученое в результате работы split()? Какие имена будут иметь элементы полученного массива строк?
PM WWW ICQ   Вверх
Eugene82
  Дата 17.10.2005, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(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() на необходимую вам функцию и готово!
PM WWW ICQ   Вверх
DeadSoul
Дата 17.10.2005, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



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

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

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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1073 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.