如何仅考虑* pointer中的前两个元素

时间:2019-10-20 14:47:42

标签: c++ pointers

从下面的代码中,您可以看到向量数组具有相同的数目两倍或更多。我要做的是从指针* 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;     
}

让我们假设我想通过取消引用指针* ptr来打印出7的前两个位置和元素。我应该使用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. 例如,如果您打印出代码,则会发现以下元素:**矢量元素为1 8 2 2 2 5 7 7 7 7 8 **。在这种情况下,元素2的前两个位置是[2]和[3],因此我想忽略位置[4]。还要提及的另一件事是,我不在乎值的大小或结果的大小与否(例如,我想同时考虑828或888)。例如,数字8在位置数组[1]和[10]中。我也会考虑这一点。

2 个答案:

答案 0 :(得分:2)

创建一个映射,其中每个值都作为键存储,并映射到索引列表:

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.firstvalue,而pair.second是{{1} }。)

答案 1 :(得分:1)

您可以使用mapunordered_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
相关问题