Как считать только первые два элемента из * указателя - PullRequest
2 голосов
/ 20 октября 2019

Из приведенного ниже кода вы можете видеть, что векторный массив имеет одинаковое число дважды или больше, чем. То, что я хочу сделать, - это найти первые две одинаковые цифры по указателю * ptr

 #include<iostream> 
#include<iterator> // for iterators 
#include<vector> // for vectors 
using namespace std; 
int main() 
{ 
    vector<int> ar = { 1,8,2, 2, 2, 5,7,7,7,7,8 }; 

    // Declaring iterator to a vector 
    vector<int>::iterator ptr; 

    // Displaying vector elements using begin() and end() 
    cout << "The vector elements are : "; 
    for (ptr = ar.begin(); ptr < ar.end(); ptr++) 
        cout << *ptr << " "; 
        return 0;     
}

Давайте предположим, что я хочу распечатать первые две позиции и элементы 7, разыменовав указатель * ptr. Должен ли я использовать условие if, например

int *array = ptr.data(); 
for( int i =0; i < ar.size(); i++) {

if( array[i] - array[i+1]+ ==0)
    cout<<array[i]<<endl;

}

Но как я могу гарантировать, что оно не ищет только первые два одинаковых элемента из * ptr?

ОБНОВЛЕНИЕ

Устранение вопроса:

  1. Причина, по которой я всегда хочу узнать первую и вторую позицию одного и того же элемента из разыменования указателя, заключается в том, чтопозже я проведу некоторое исследование, и в этом исследовании мне дадут некоторое время, связанное с первой и второй позицией того же номера. Проблема, я хотел игнорировать те же самые элементы, которые все еще повторяются после второго раза, состоит в том, что я хочу игнорировать эти позиции элементов в моих вычислениях.
  2. Например, если вы распечатаете код, вы найдетеelement: ** Элементами вектора являются 1 8 2 2 2 5 7 7 7 7 8 **. В этом случае первые две позиции элемента 2, это [2] и [3], поэтому я бы хотел игнорировать позицию [4]. Еще одна вещь, которую стоит упомянуть, это то, что мне все равно, будет ли значение или последующим, или нет [я имею в виду, например, 828 или 888, я бы рассмотрел оба]. Например, число 8 находится в массиве местоположений [1], а в [10]. Я бы тоже это учел.

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Создайте карту, в которой каждое значение хранится в виде ключа, сопоставленного со списком индексов:

std::unordered_map<int, std::vector<size_t>> indexMap;

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

for (size_t index = 0; index < ar.size(); index++)
{
    indexMap[ar[index]].push_back(index);
}

СейчасВы можете циклически перемещаться по карте и работать с каждым значением, имеющим 2 или более индексов, и использовать только первые 2 индекса для всего, что вы хотите сделать:

for (auto const& [value, indices] : indexMap)
{
    if (indices.size() < 2)
        continue;

    size_t firstIndex = indices[0];
    size_t secondIndex = indices[1];

    // do whatever
}

(Если вы не используетеC ++ 17 или выше, используйте for (auto const& pair : indexMap), где pair.first равно value и pair.second равно indices.)

1 голос
/ 20 октября 2019

Вы можете использовать map или unordered_map для регистрации индексов каждого значения.

Вот простая демонстрация концепции:

#include<iostream>
#include<vector>
#include<map>

using namespace std;

int main() {
  vector<int> ar{ 1, 8, 2, 2, 2, 5, 7, 7, 7, 7, 8 };
  map<int, vector<size_t> > occurrences{ };

  for (size_t i = 0; i < ar.size(); ++i) {
    occurrences[ar[i]].push_back(i);
  }

  for (const auto& occurrence:occurrences) {
    cout << occurrence.first << ": ";
    for (auto index: occurrence.second) {
      cout << index << " ";
    }
    cout << endl;
  }

  return 0;
}

Вывод:

1: 0
2: 2 3 4
5: 5
7: 6 7 8 9
8: 1 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...