关于在c ++中迭代数组的问题

时间:2011-08-04 00:26:51

标签: c++ arrays

我有一个不一定是满的数组。

它可能非常稀疏。

有没有一种很好的方法来迭代这个数组而不访问所有可能的索引? (c ++数组迭代器?)

或者,即使我使用数组迭代器,它与访问每个索引和检查值没什么不同?

4 个答案:

答案 0 :(得分:4)

是的,如果使用迭代器,它与访问每个索引并检查值相同,并且没有好的方法可以跳过逻辑漏洞。你可以保留一份好的索引列表,但是如果你这样做,那么为什么不首先使用列表来存储数据呢?

如果您的数据非常稀疏,可能更好的数据结构是std::map,甚至是std::unordered_map,具体取决于您的应用。它们具有不错的查找时间,同时不会浪费太多空间,就像数组一样。

答案 1 :(得分:1)

Associate Array是您正在尝试构建的。我建议你找一个为你做这个的图书馆!

答案 2 :(得分:0)

如果你需要一个模拟数组的键/值关联,只需使用一个std :: map来保存一个std :: pair。然后,您可以使用索引(键)检索值,并仅快速迭代您的实际值集。

http://en.cppreference.com/w/cpp/container/map

std :: map具有类似operator []的语法便利,它们就像一个数组。

答案 3 :(得分:0)

您是否真的需要坚持使用基于阵列的解决方案boost::filter_iterator可能很有用。以下是整数数组的小例子:

#include <algorithm>
#include <iostream>
#include <boost/iterator/filter_iterator.hpp>

struct is_not_null {
  bool operator()(int* t) {
    return t != NULL ? true : false;
  }
};

int main()
{
  int* a[] = {NULL, NULL, NULL, NULL, NULL, NULL };
  a[0] = new int[3];
  a[0][0] = 1; a[0][1] = 2; a[0][2] = 3;
  a[3] = new int[3];
  a[3][0] = 3; a[3][1] = 4; a[3][2] = 5;
  a[5] = new int[3];
  a[5][0] = 5; a[5][1] = 6; a[5][2] = 7;

  typedef int** base_iterator;
  typedef boost::filter_iterator<is_not_null, base_iterator>
    FilterIter;

  for(FilterIter it = boost::make_filter_iterator< is_not_null >(a, a + 6);
      it != boost::make_filter_iterator< is_not_null >(a + 6, a + 6);
      ++it) {
    std::cout << (*it)[0] << " " << (*it)[1] << " " << (*it)[2] << std::endl;
  }

  // nevermind the leaks
  return 0;
}