【问题标题】:How to find the index of a pointer that points to an element in an array?如何找到指向数组中元素的指针的索引?
【发布时间】:2018-09-26 13:56:36
【问题描述】:

所以我正在尝试编写一个将元素添加到我的数组的方法。我的 find_key() 方法返回一个指针,该指针指向一个等于或大于在现有数组中找到的元素。有没有办法找到我的 find_key() 指针指向的元素的索引?

这是我目前正在使用的内容

template<typename K, typename V>
bool MapSet<K,V>::add(Node<K,V> n)
{
  Node<K, V> *ptr = find_key(n.first);
  if (size() == capacity_)
  {
    capacity_ *= 2; // Double capacity
    auto *new_data = new [capacity_]; // New array with double capacity
    copy(ary_, ary_+last_, new_data); // Copy over
    swap(ary_, new_data); // Swap pointers
    delete [] new_data; // Delete old array pointer (old since swapped)
  }
  if (size() == 0)
  {
    ary_[0].first = n.first;
    ary_[0].second = n.second;
    return true;
  }
  else if (ptr == ary_+last_)
  {
    ary_[ptr].first = n.first;
    ary_[ptr].second = n.second;
    return true;
  }
  else if ((*ptr) == n.first)
  {
    return false;
  }
  else if ((*ptr) !== n.first)
  {
    ary_[ptr-1].first == n.first;
    ary_[ptr-1].second == n.second;
    return true;
  }

}

【问题讨论】:

  • 请注意,由于您在执行重新分配之前找到了ptr,如果ptr 指向ary_ 的元素,那么每当发生重新分配时,它将是danling 指针。虽然现在我重新阅读了这个问题,但似乎这就是您可能要解决的问题。
  • 您可能正在寻找std::distance
  • @François Andrieux 谢谢!

标签: c++ arrays c++11 pointers indexing


【解决方案1】:

由于您使用的是指针,您可以通过简单地从找到的指针中减去指向数组中第一个元素的指针来获取数组的索引。所以

Node<V, K>* ptr = ...
size_t index = static_cast<size_t>(ptr - ary_);

应该做的伎俩(如果数组来自类型Node&lt;V, K&gt;[])。如果您的类支持迭代器,您也可以改用std::distance

【讨论】:

  • 此解决方案有效。但我想指出,指针满足随机访问迭代器的要求,并且兼容基于迭代器的算法,例如std::distance
  • “如果你的类支持迭代器......”你误会了。每个指向数组元素的指针都是一个迭代器。 std::distance更加灵活。不少于。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多