我有一个不一定是满的数组。
它可能非常稀疏。
有没有一种很好的方法来迭代这个数组而不访问所有可能的索引? (c ++数组迭代器?)
或者,即使我使用数组迭代器,它与访问每个索引和检查值没什么不同?
答案 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;
}