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


Автор: in550 9.8.2007, 11:05

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

Код

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"). 
// Создать не проблема, но я заранее не знаю какой элемент будет в списке.
}

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

Автор: korbian 9.8.2007, 13:30
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: не компилировал

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

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

Автор: akizelokro 9.8.2007, 14:15
А так не прокатит?

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 

Автор: korbian 9.8.2007, 14:25
ИМХО, функторы универсальней.

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

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

Автор: korbian 9.8.2007, 14:43
akizelokro,  возможно вы правы.

Автор: gif0 20.12.2009, 23:07
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);
}


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

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