2014-09-08 3 views
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"); 

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

EDIT

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

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'. Вы ищете строку. Что означает, что «узел» соответствует строке? Как компилятор должен это знать? –

+0

@IgorTandetnik Это мой вопрос. В этом случае что нам делать? – Bernard

+0

Почему вы хотите, чтобы компаратор принимал себя как параметр? Вы хотите сравнить строку с 'node', no? –

ответ

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.

Смежные вопросы