Как найти элемент структуры в двухмерном векторе?

0

У меня есть структура:

struct node
{
    string val;
    int count;
};

Я определил свой вектор таким образом:

typedef std::vector<node> StringVector;
typedef std::vector<StringVector> StringVector2D;

И вот мой код:

string arr[6] = {"hi","mr","ben","ss","rty","ben"};

StringVector2D twoD;    

StringVector inner;
twoD.push_back(inner);  


for(int f=0;f<6;f++)
{

    node tmp;
    tmp.val = arr[f];
    tmp.count = arr[f].size();

    twoD[0].push_back(tmp); 

}


for (StringVector::iterator it = twoD[0].begin() ; it != twoD[0].end(); ++it)
{
    cout<< it->val<<endl;
}

... В этом примере у меня есть только одно измерение в моем внешнем векторе, так как вы можете видеть это: twoD[0]

StringVector::iterator it = find(twoD[0].begin(), twoD[0].end(), "ben");

if(it == twoD[0].end())
{
    cout<<"not found"<<endl;
}

Я использовал это

StringVector::iterator it = find(twoD[0].begin().val, twoD[0].end().val, "ben");

а также

StringVector::iterator it = find(twoD[0].begin()->val, twoD[0].end()->val, "ben");

Но это не сработало. Оцените любое предложение.

РЕДАКТИРОВАТЬ

Я определил свой собственный поиск:

  struct find_word
    {
        string val;
        find_word(string val) : val(val) {}
        bool operator () ( const find_word& m ) const
        {
            return m.val == val;
        }
};

И назовите это здесь:

StringVector::iterator it = find_if(twoD[0].begin()->val, twoD[0].end()->val, find_word("ben"));

Но он не может заставить его работать.

  • 0
    Элементами twoD[0] являются node s. Вы ищете строку. Что это значит для node чтобы соответствовать строке? Как компилятор должен это знать?
  • 0
    @IgorTandetnik Это мой вопрос. В этом случае что нам делать?
Показать ещё 4 комментария
Теги:
find
vector
search
stl

1 ответ

2
Лучший ответ

Вам нужно изменить функтор- find_if.

struct find_word {
    string val;
    find_word(string val) 
      : val(val) {}
    bool operator()(const node& m) const { return m.val == val; }
}; //                     ^^^^ the change is here 

И используйте версию find_if следующим образом:

StringVector::iterator it = find_if(twoD[0].begin(), twoD[0].end(), find_word("ben"));
//                              the change is here ^     and here ^

Функтор find_if получает в качестве параметра в operator() элемент контейнера для поиска. В этом случае twoD[0].begin() и twoD[0].end() дают вам доступ к элементам внутренний вектор и получаемые параметры являются типом хранения элемента во внутреннем векторном node.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню