给定一个 Vector of Vectors(二维向量),任务是将这个二维向量展平。
例子:
Input: vector = [[1, 2, 3, 4], [5, 6], [7, 8]]
Output: 1 2 3 4 5 6 7 8
Input: vector = [[1, 2], [3], [4, 5, 6, 8]]
Output: 1 2 3 4 5 6 8
算法:
- 2D Vector 可以使用迭代器展平。
- 将每个向量的开始和结束迭代器存储在两个数组中,分别是 iStart 和 iEnd。
- 创建一个hasNext() 方法来检查它是否有向量有下一个元素。
- 打印当前元素,如果 hasNext() 产生 true
下面是上述方法的实现:
// C++ program to flatten a
// Vector of Vectors or 2D Vector
#include
using namespace std;
// Class to flatten the 2d vector
class FlattenVector {
public:
int n;
vector::iterator> iStart;
vector::iterator> iEnd;
int currIndex;
// Store ending and starting iterators.
FlattenVector(vector >& v)
{
// Get the number
// of rows in 2d vector
n = v.size();
currIndex = 0;
iStart.resize(n);
iEnd.resize(n);
for (int i = 0; i < n; i++) {
iStart[i] = v[i].begin();
iEnd[i] = v[i].end();
}
}
// Returns true if any element is left.
bool hasNext()
{
for (int i = 0; i < n; i++) {
if (iStart[i] != iEnd[i])
return true;
}
return false;
}
int next()
{
// Vector at currIndex is printed,
// increment currIndex.
if (iStart[currIndex]
== iEnd[currIndex]) {
currIndex++;
return next();
}
// Increment iterator
// and return the value.
else
return *iStart[currIndex]++;
}
};
// Driver code
int main()
{
vector >
v{ { 1, 2 },
{ 3 },
{ 4, 5, 6 },
{ 7, 8, 9, 10 } };
FlattenVector iter(v);
while (iter.hasNext())
cout << iter.next() << " ";
return 0;
}
输出:
1 2 3 4 5 6 7 8 9 10
想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解基础加 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程。