2014-02-17 3 views
0

Режим, являющийся числом, которое чаще всего встречается в наборе чисел Мне нужен мой код для обработки одиночных режимов, мультирежимов и режимов. У меня есть следующий код, который я в настоящее время используется, но она имеет несколько ошибок:Векторный режим

vector<int> findMode(vector<int>& v){ 
int curBig = 0; 
int absBig = 0; 


vector<int> mode; 
vector<int>::iterator it; 
//sort for easy comparing of numbers 
sort(v.begin(), v.end()); 
//loop for as long as the vector is 
for (auto x : v){ 
    //as long as x is less than the size of v, do the rest (if x was the size of v, then v[x+1] would be out of bounds 
    if (x < v.size() - 1){ 
     //compare the current number and the number after it 
     if (v[x] == v[x + 1]){ 
      //if they're the same incrament current big by 1 
      curBig++; 
      //if current big is bigger than the absolute big then set absBig to curBig 
      if (curBig > absBig){ 
       absBig = curBig; 
      } 
     } 
     //reset curBig for the next set of numbers 
     else 
      curBig = 0; 

    }//x < v.size() 
}//auto x : v 

int newBig = 0; 
//if abs is not 0, do the following 
if (absBig > 0){ 
    for (auto x : v){ 
     //runs basically the same ifs as above 
     if (x < v.size() - 1){ 
      if (v[x] == v[x + 1]){ 
       newBig++; 
       //this is supposed to push the mode(s) to the back of the vector 
       if (newBig == absBig){ 
        mode.push_back(v[v.front() + x]); 
       } 
      } 
     } 

    } 
} 
else if (absBig == 0) 
    mode.push_back(-999); 


return mode; 

}

, а затем в основном, я использовал это, чтобы распечатать режим (ы):

if (mode[0] != -999){ 
    cout << "{"; 
    for (vector<int>::iterator it = mode.begin(); it != mode.end(); ++it){ 
     cout << *it; 
     if (it < mode.end() - 1){ 
      cout << ", "; 
     } 
     cout << "}" << endl; 
    } 
} 
else 
    cout << "No Modes" << endl; 

Theres просто две ошибки, которые я не могу вычислить. , если вектор ints имеет режим двух (то есть 1,2,2,3,4 и т. Д. [Режим равен 2]), программа видит это просто как «Нет режима». Очевидно, что я где-то в 1 раз, я просто не вижу, где именно.

И вторая ошибка, которую я испытываю, заключается в том, что «mode.push_back (v [v.front() + x]); не делает то, что он должен. на мой взгляд, любое число, которое соответствует критериям (любое число, которое является режимом), должно быть перенесено в обратную сторону вектора режима, но по какой-то причине мой вектор режима может хранить только один номер. Возможно, у меня есть синтаксическая ошибка, которую я не вижу?

Любая помощь была бы принята с благодарностью!

ответ

0
for (auto x : v){ 

Это перебирает все элементы v, а не через все индексы v. Таким образом, вы не можете использовать это для цикла, чтобы проверить позицию вы в настоящее время или индекс v, как вы здесь:

if (v[x] == v[x + 1]){ 

Используйте цикл по индексам вместо:

for(unsigned x = 0; x < v.size(); ++x) 

Поскольку вы всегда останавливая цикл уже при x < v.size()-1, вы можете также использовать

for(unsigned x = 0; x < v.size()-1; ++x) 

который сделает чек ненужным.

push_back Вставляет один данный элемент в конец вектора. Таким образом,

mode.push_back(v[v.front() + x]); 

Вставить один элемент из v. Однако это должно быть v[x], а не v[v.front() + x]. v.front() возвращает значение первого элемента v, к которому вы добавляете x, а затем получите элемент v в этом положении (что звучит не так, как надо). v[v.front() + x] эквивалентен v[v[0] + x].

Во втором цикле вы забыли сбросить счетчик, как только найдете разные элементы. Это здесь:

//reset curBig for the next set of numbers 
else 
    curBig = 0; 

также должен появиться там (но с newBig вместо curBig).

Также обратите внимание, что ваш код, вероятно, должен возвращать v, если нет элемента, появляющегося дважды, потому что технически все элементы являются режимами в этом случае.

+0

Я попробую то, что вы сказали. У меня было v [x] заранее, и я решил, что это правильно, однако кто-то (здесь) сказал мне иначе (использовать v.front() и т. Д.), Поэтому, не спрашивая, я использовал его метод, я буду реализовывать ваши предложения и вернитесь с ответом в нескольких –

+0

@CristianC. Для того, чтобы мое последнее предложение работало, вам также необходимо заменить for-loops, как я предложил. – Nabla

+0

Большое вам спасибо, ваше предложение исправило одну из моих ошибок, теперь только один, и я буду очень доволен. для (без знака x = 0; x

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