Использование «find» для доступа к значению в векторе - PullRequest
0 голосов
/ 12 мая 2019

Итак, я немного освежился в c ++ и обнаружил, что я очень ржавый по сравнению с другими моими языками.Я работал над этой проблемой с codewars.com

Учитывая список lst и число N, создайте новый список, который содержит каждое число lst не более N раз без переупорядочения.Например, если N = 2, а ввод [1,2,3,1,2,1,2,3], вы берете [1,2,3,1,2], отбрасываете следующее [1,2], поскольку это приведет к тому, что 1 и 2 будут в результате 3 раза, а затем - 3, что приводит к [1,2,3,1,2,3].

Для этогоЗадача Я хотел создать многомерный вектор для хранения уникальных значений предоставленного списка в первом измерении и соответствующего числа вхождений во втором измерении.Тем не менее, я был незнаком с синтаксисом c ++, чтобы выполнить это, поэтому я просто создал 2 отдельных вектора. (Instance, countOfInstance)

По сути, мой алгоритм будет делать:

  • , проходить черезпредоставленный массив (arr)
  • проверяет, не существует ли значение в "arr" в "экземплярах"
  • Если не найдено, тогда передайте значение в "arr" в "instances",
  • добавить значение подсчета 1, соответствующее этому индексу в "countOfInstance"
  • , а затем добавить значение в "arr" в nFilteredVector.

Если значение в "arr" найдено в "экземплярах", то:

  • Найти значение индекса "arr" в "экземплярах"
  • Используйте этот индекс, чтобы найти соответствующее значение счетчика в "countOfInstances"
  • Определите, является ли счет меньше, чем предоставленное "N"
  • , если меньше "N", добавьте к "nFilteredVector"
  • Затем увеличиваем значение в "countOfInstances"

Однако, когда я пытаюсь получить доступ к индексу "CountOfInstances" с индексом "instances", я получаю странную ошибку

нет жизнеспособного перегруженного оператора [] для типа 'std :: vector' if (countOfInstances [std :: find (instances.begin (), instances.end (), arr [i])] <= 2){</p>

Исправьте меня, если я ошибаюсь, но, насколько я понимаю, функция find возвращает значение индекса найденного элемента.Я хотел использовать это значение индекса для доступа к вектору countOfInstances.

Может кто-нибудь помочь мне разобраться в правильном синтаксисе того, что я ищу.Бонусные баллы за интеграцию «экземпляров» и «countOfInstance» в качестве многомерного вектора !!

#include <algorithm> 
            std::vector<int> deleteNth(std::vector<int> arr, int n)
            {
              std::vector<int> nFilteredVector;
              std::vector<int> instances;
              std::vector<int> countOfInstances;

              for (int i =0; i < arr.size();i++){
                if(std::find(instances.begin(), instances.end(),arr[i])==instances.end()){//value not found need to add corresponding value to instances vector then add an element of 1 to the correpeonding index of the countOfInstance vector.
                  instances.push_back(arr[i]);
                  countOfInstances.push_back(1);
                  nFilteredVector.push_back(arr[i]);
                }else{ // value is found just need to increment the value in countOfInstances
                  //find the instance of the value in arr in the instance vector, use that value to find the corresponding value in countOfInstance
                  if (countOfInstances[std::find(instances.begin(), instances.end(),arr[i])] <=n){
                    nFilteredVector.push_back(arr[i]);      
                  }
                  countOfInstances[std::find(instances.begin(), instances.end(),arr[i])]++;
              }



              return nFilteredVector;
            }

Вот несколько примеров того, какие кодовые войны будут тестироваться для

                {
                Assert::That(deleteNth({20,37,20,21}, 1), Equals(std::vector<int>({20, 37, 21})));
                Assert::That(deleteNth({1,1,3,3,7,2,2,2,2}, 3), Equals(std::vector<int>({1, 1, 3, 3, 7, 2, 2, 2})));
              }

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Если вы пытаетесь получить индекс найденного элемента в std::vector, следующее выполняет эту работу, используя std :: distance :

#include <algorithm>
#include <vector>

auto iter = std::find(instances.begin(), instances.end(),arr[i]);
if ( iter != instances.end())
{
   // get the index of the found item
   auto index = std::distance(instances.begin(), iter);
   //...
}
0 голосов
/ 12 мая 2019

Я считаю, std::find вернуть итератор на instances. Вы не можете использовать итератор из одного списка в другом, и вы не можете использовать итератор в качестве индекса.

Что вы могли бы сделать, это использовать std::find(instances.begin(), instances.end(), arr[i]) - instances.begin() как твой индекс. Это немного уродливо, так что вы также можете посмотреть на итераторы и как их использовать.

...