2010-10-24 2 views
0

Я пытаюсь найти наиболее эффективный, оптимизированный и быстрый способ сравнить с std векторами CString. строки, о которых идет речь, чувствительны к регистру. Я попытался использовать оператор == для векторного контейнера, но это иногда возвращает ложные срабатывания. Я имею в виду, например, если один вектор содержит элементы в порядке (a, b, c), а другой имеет их в порядке (b, c, a), оператор == возвращает false, даже если они используют одни и те же данные. Другое дело, что он не делает случайного сравнения.Что является лучшим методом для сравнения двух векторов CString

Я думал об использовании основного вложенных циклов подходить так:

//Not Tested 

BOOL bMatch = TRUE; 
for(int i=0; i<Vec1.size();i++) 
{ 
    if(!bMatch) 
    break; 
    int nComp=0; 
    for(int j=0;j<Vec2.size();j++) 
    { 
    if(vec1[i].CompareNoCase(Vec2[j])==0) 
     { 
      //We have a match--check next item 
      break; 
     } 
    else 
     { 
      nComp++; 
      if(nComp == Vec2.size()-1) 
      { 
       //Reached end of vector and no match found 
       //Vectors don't match 
       bMatch=FALSE; 
      } 
     } 

    } 
} 

Приведенный выше код не проверяется, и я не уверен, если есть, вероятно, лучший способ добиться такого сравнения без необходимости используя вложенные циклы.

бы признателен за любые советы или помощь ...

+1

Пожалуйста, определите «два вектора CString» - это 'vector ', 'vector ', 'vector >' или что-то еще? Может быть, простая строка? –

+1

@Tim: 'CString', по-видимому, является классом строк MFC. –

+0

Я думаю, что он сам объяснительный ... но просто быть хорошим его вектором

ответ

5

Если один вектор содержит элементы в порядке (a, b, c), а другой имеет их в порядке (b, c, a), оператор == возвращает false, даже если они используют одни и те же данные ,

Просто вставьте данные в двух контейнерах, где порядок не имеет значения, и сравнить их:

std::vector<CString> vec1; 
std::vector<CString> vec2; 

// ... 

std::multiset<CString> set1(vec1.begin(), vec1.end()); 
std::multiset<CString> set2(vec2.begin(), vec2.end()); 

bool equal_data = (set1 == set2); 

Если вы хотите, чтобы игнорировать регистр (который код в ваш вопрос, кажется, предложить), вам может параметризировать std::multiset и std::equal с соответствующим компаратором:

struct compareNoCase 
{ 
    bool operator()(const CString& a, const CString& b) 
    { 
     return a.CompareNoCase(b); 
    } 
}; 

std::vector<CString> vec1; 
std::vector<CString> vec2; 

// ... 

std::multiset<CString> set1(vec1.begin(), vec1.end(), compareNoCase()); 
std::multiset<CString> set2(vec2.begin(), vec2.end(), compareNoCase()); 

bool equal_data = std::equal(set1.begin(), set1.end(), 
          set2.begin(), 
          compareNoCase()); 

параметризация std::multiset гарантирует, что «привет» и «HELLO» в такой же вектор рассматривается как одно значение, а параметризация std::equal гарантирует это через два вектора.

И, наконец, если вы знаете, что в одном vector не происходит ни одного элемента, вы можете использовать set вместо multiset. Обратите внимание, что, вероятно, лучше начать работу с set или multiset с самого начала.

+0

Я считаю, что OP сказал сравнить векторы C-Strings. В этом случае вы не можете сравнивать два набора char * с == и получать разумные результаты. Но у ОП может быть естественно перепутана терминология –

+0

@Armen: Я не уверен, что должен существовать 'CString'. Я буду ждать, пока ОП уточнит, а затем изменит мой пост, если это необходимо. – fredoverflow

+0

@Red: Ну, вы хотите, чтобы «привет» был равен «HELLO» или нет? – fredoverflow

2

, если (а, б, в) и (Ь, с, а) то же самое для вас, то вектор плохой выбор, использовать std::set или std::multiset вместо , и, как уже говорилось, сравните их с std::equal и передайте strcmp в качестве аргумента компаратора. Этот ответ действителен, если по CString вы имеете в виду массивы символов C-style с нулевым завершением. Если CString означает MFC CString, ответ FredOverflow является идеальным.

0

Сортируйте их сначала с помощью std :: sort, а затем сравните их с std :: equal.

0

Не используйте простой для петли. Вместо этого вы можете использовать итераторы для извлечения элементов из обоих векторов, а затем сравнить значения либо с помощью _tcscmp, либо wcscmp.

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