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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> STL и поиск создание, primer 
:(
    Опции темы
in550
  Дата 9.8.2007, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 11
Регистрация: 16.1.2007

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




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

Код

primer.push_back("a");
primer.push_back("b");
primer.push_back("c");
primer.push_back("d");

if(std::find(primer.begin(),primer.end(),"b") == primer.end()) // нашел  "b"
{
//  Тут создаю папку с именем этого элемента (в данном случае "b"). 
// Создать не проблема, но я заранее не знаю какой элемент будет в списке.
}

PM MAIL   Вверх
akizelokro
Дата 9.8.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



 smile 
Не просёк чего-то. = сижу в недоумках (недоумении).
При данном условии "b" как раз и не найдено (==primer.end()).
по второй части тоже недопонимание. предположим, что условие поправишь. но тогда ты явно знаешь, какой элемент там будет (который будет равен "b"). В чем проблема-то? Хочешь намотать проверку на значение элемента, чтобы в нем были только символы, разрешенные файлсистемой?


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
korbian
Дата 9.8.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



in550, тебе нужен функтор

примерно такой
Код

struct someFunc : public std::unary_function<bool, std::string >
{
  someFunc(const std::string& someString)
    : _str(someString)
  {
  }
  bool operator()(const std::string &str)
  {
    return _str == str;
  }
  std::string _str;
};

// использование
std::list<std::string> someList;

someFunc sf("конкретная_строка");
std::list<std::string>::const_iterator it = std::find_if(someList.begin(), someList.end(), sf);
if(it == someList.end())
{
   // строка не найдена
}
else
{
  // it - указвает на искомый элемент
}


PS: не компилировал

Это сообщение отредактировал(а) korbian - 9.8.2007, 13:55


--------------------
korbian ©
PM   Вверх
Любитель
Дата 9.8.2007, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



korbian, во-первых с функторами юзается find_if, а во вторых обычный финд как раз оператором = и сравнивает. Вообще не понял вопроса изначального, если честно smile


--------------------
PM MAIL ICQ Skype   Вверх
korbian
Дата 9.8.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Любитель, прям в точку. 
я find_if и подразумевал, но опечатался (жаркая пора, сдачи). 



--------------------
korbian ©
PM   Вверх
akizelokro
Дата 9.8.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



А так не прокатит?

void myFunc(std::string& sf )
{
  std::list<std::string> someList; 
// инициализация списка. Здесь будет город заложён.
  std::list<std::string>::const_iterator it = std::find(someList.begin(), someList.end(), sf);
  if(it == someList.end())
  {
   // Дома нету никого! Заходите в понедельник.
  }
  else
  {
    // нашлась крокозябра! Тут мы её и...
  }
}

Наскока знаю, функторы или предикаты неплоха зажигают, когда условие сравнения достаточно нестандартное.  А тут все просто. И если вопрос только в этом, то лучше автору порекомендовать ссылку на учебник. Угу? smile 

Это сообщение отредактировал(а) akizelokro - 9.8.2007, 14:17


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
korbian
Дата 9.8.2007, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ИМХО, функторы универсальней.


--------------------
korbian ©
PM   Вверх
akizelokro
Дата 9.8.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



 smile Я про то,  что не надо из пушки по воробьям стрелять. Оно же бритва Оккама. Чтобы потом не было мучительно больно за бесцельно написанные строки.
Кстати, мона пофилосовствовать на тему, что извратно понимаемая "универсальность" и обьектно-ориентированная парадигма приводят к распуханию кода и тык дыкс по списку.  

Искренне ваш вобло и зебро, smile 


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
korbian
Дата 9.8.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



akizelokro,  возможно вы правы.


--------------------
korbian ©
PM   Вверх
gif0
Дата 20.12.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



in550, find вернет итератор на найденные элемент. Т.к. итератор - это указатель, то можно получить доступ к элементу, на который указывает этот итератор использую оператор "*":

Код

primer.push_back("a");
primer.push_back("b");
primer.push_back("c");
primer.push_back("d");

std::vector<string>::iterator iter = std::find(primer.begin(),primer.end(),"b");
if(iter != primer.end()) // нашел  "b"
{
    CreateDirectory(*iter.c_str(), NULL);
}


Протестить это дело не было времени, но все должно быть более-менее компилирующееся.

Это сообщение отредактировал(а) gif0 - 20.12.2009, 23:08
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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