我有n
个向量,我需要一致地迭代所有这些向量。
我的意思是首先我需要遍历第一个向量的所有元素然后迭代第二个向量的所有元素,依此类推。
我的任务是一致地比较所有元素,包括k-1
'向量的最后一个元素和k
'向量的第一个元素。
我知道解决方案,我首先在一个大的最终向量中将所有这些向量合并,然后迭代最终向量。 但在我看来,这种解决方案浪费了大量的记忆和时间。
请帮我找到更优化的解决方案。 如果它存在。
例如,复杂性:O(1)
额外内存和O(n)
时间。
答案 0 :(得分:1)
如果你只需要可以迭代的东西,你可能想要ranges::view::concat
给定N个源范围,产生一个结果范围,它是所有这些范围的串联。
这不会复制任何值,O(1)存储和O(1)时间也是如此。
如果你需要的东西完全 std::vector<MyClass>
,那么你运气不好,你将不得不填充一个包含所有值的向量。
答案 1 :(得分:1)
一种简单的方法是使用两个嵌套循环。
在C ++ 11及更高版本中,只需执行
std::vector<std::vector<int> > vec;
// some code that sets up the vectors in vec
for (auto &v : vec) // iterate over the vectors in vec
{
for (auto &e : v) // iterate over the elements of v
{
// do whatever is needed to element e
}
}
如果需要,v
和e
可以const
限定(表示不更改向量或其元素)。迭代的总数将是包含的向量的元素的数量。额外的内存使用量将是(在内部循环中的任何时间点)两组引用 - 一组用于控制内循环,一组用于外循环(即没有向量或元素本身的副本)。
在C ++ 11之前,使用与迭代器而不是范围一起使用的for
循环可以更简洁地重写上述循环;
for (std::vector<std::vector<int> >::iterator v(vec.begin()), vend(vec.end());
v != vend; ++v)
{
for (std::vector<int>::iterator e(v->begin()), eend(v->end());
e != eend; ++e)
{
// do whatever is needed to element *e
}
}
请注意需要以此形式取消引用迭代器。