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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм find для структуры 
:(
    Опции темы
Rutti
Дата 12.2.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Возможно ли использовать алгоритм find в структурах?
К примеру:
Код

struct FF
{
    string AA;
    int BB;
}CC;

vector<FF> vec;


Надо найти позицию элемента вектора vec, сожержащего выбранную строку.
PM MAIL   Вверх
JackYF
Дата 12.2.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



используй std::find_if.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Daevaorn
Дата 12.2.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(Rutti @  12.2.2007,  19:17 Найти цитируемый пост)
Возможно ли использовать алгоритм find в структурах?

да. есть несколько вариантов.
1. как сказал JackYF, использовать std::find_if и свой предикат сравнения
2. или определить у структуры оператор сравнения, и в нем сравнивать строки, то можно обойтись и просто std::find
PM MAIL WWW   Вверх
JackYF
Дата 12.2.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



Цитата(Daevaorn @  12.2.2007,  18:34 Найти цитируемый пост)
2. или определить у структуры оператор сравнения, и в нем сравнивать строки, то можно обойтись и просто std::find 

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Rutti
Дата 13.2.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



all

Т.е. только через предикат сравнения? Это как может выглядеть?

Это сообщение отредактировал(а) Rutti - 13.2.2007, 12:33
PM MAIL   Вверх
chaos
Дата 13.2.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



вот тебе пример:

Код

#include <vector>
#include <algorithm>
#include <time.h>

using namespace std;

/////////////////////////////////////////////////////////////////////////////////////////
//Твоя структруа
struct SData
{
    int m_nItem;
    string m_soValue;
};

/////////////////////////////////////////////////////////////////////////////////////////
//эта функция для вывода в поток ostream
ostream& operator << (ostream& os, const SData& c_orData)
{
    os << c_orData.m_nItem << "     " << c_orData.m_soValue.c_str();
    return os;
}

/////////////////////////////////////////////////////////////////////////////////////////
//Класс генератор, на него можешь вообще не смотреть - для создания тестовых данных
class CGenerator
{
public:
    SData operator() ()
    {
        SData oData;

        oData.m_nItem = rand();
        for (int n = 0; n < 10; n++) oData.m_soValue.push_back(65 + (rand() % 26));
        return oData;
    }
};

/////////////////////////////////////////////////////////////////////////////////////////
//это тебе надо! класс который сравнивает каждое значение(строковое из структуры) ветктора с искомой строкой
class CFinder
{
    string m_soFindStr;
public:
    CFinder(const string& c_sorFindStr): m_soFindStr(c_sorFindStr) {}

    bool operator() (const SData& c_orData)
    {
        return (c_orData.m_soValue.compare(m_soFindStr) == 0) ? true : false;
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    srand((unsigned int)time(0));

    vector<SData> cntData;

    generate_n(back_inserter(cntData), 10, CGenerator());

    copy(cntData.begin(), cntData.end(), ostream_iterator<SData>(cout, "\n"));

    cout << endl << "Enter find string" << endl;
    char szFindStr[255] = {10};
    cin >> szFindStr;

    cout << "Result: ";
    vector<SData>::iterator it;
    it = find_if(cntData.begin(), cntData.end(), CFinder(szFindStr));
    if (it != cntData.end())
        cout << it->m_nItem << endl;
    return 0;
}


что не понятно спрашивай

Это сообщение отредактировал(а) chaos - 13.2.2007, 13:41
PM WWW   Вверх
Любитель
Дата 13.2.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(JackYF @  12.2.2007,  18:50 Найти цитируемый пост)
имхо этот способ может ввести путаницу в других местах кода... 

Совершенно согласен - не тот случай.

Если в структуре был бы метод, возвращающий строковое поле (что наиболее логично с точки зрения ООП-проектирования), то я бы сделал так:
Код

std::vector<FF>::iterator it = std::find_if(vec, boost::bind(std::equal_to<std::string>(),
                                        searched_string, boost::bind(&my_struct::get_string));


Можно и через std::bind1st, std::mem_fun, но менее красиво.

Без метода можно написать с использованием boost::lambda, но я бы в данном случае не стал так делать. 

А видя JackYF - тихо замолкаю...

Это сообщение отредактировал(а) Любитель - 13.2.2007, 15:47


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


полуавантюрист
****


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

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



Цитата(Любитель @  13.2.2007,  15:47 Найти цитируемый пост)
А видя JackYF - тихо замолкаю...


Извините за оффтопик...

Да ладно smile Я же говорил, что когда понадобится буст - буду его юзать. Так вот, недавно он мне таки понадобился... Когда начал разрабатывать мультипоточную фигню. Естественно, захотелось кроссплатформенности. Решил, что буду юзать boost::thread. А ввиду некоторых особенностей данной библиотеки (ну или класса) там и без boost::bind сложно обойтись.

Ввиду этого ты теперь можешь при мне писать код с помощью буста, и я особо возражать не буду  smile 



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0807 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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