如何将向量中每个顺序递增的序列存储到新向量中
How to store every sequentially increasing sequence in a vector into new vectors
我有一个包含以下元素的向量:
std::vector<int> vectorOfInts{ 95, 137, 138, 139, 140, 156, 157, 158, 159 };
问题:我正在尝试将每个序列存储在一个新向量中,其中每个序列被定义为一个按顺序递增的值列表(递增 1)。
vectorOfInts
的一些属性:
- 序列的数量已知,但每个序列的长度以及每个序列中的第一个和最后一个元素都是未知的。
- 始终对所有元素进行排序,从最低到最高。
- 序列由数字列表定义,其中下一个数字比前一个数字大 1。
- 序列的最短长度为1。
对于这个例子,有 3 个序列:[95]
、[137, 138, 139, 140]
和 [156, 157, 158, 159]
。 95
是序列 1 的第一个和最后一个元素,137
是序列 2 的第一个元素,140
是序列 2 的最后一个元素,156
是第一个序列 3 的元素,159
是序列 3 的最后一个元素。
我必须为每个序列将序列存储在一个新的不同向量中,即 std::vector<int> vec1 = {95}
、std::vector<int> vec2 = {137, 138, 139, 140}
和 std::vector<int> vec3 = {156, 157, 158, 159}
。
我想我必须遍历 vectorOfInts
并检查下一个索引处的数字是否比当前索引处的数字大 1。我还考虑过根据某些标准对 vectorOfInts
进行分区。
一些伪代码:
#include <vector>
int main()
{
std::vector<int> vectorOfInts{ 95, 137, 138, 139, 140, 156, 157, 158, 159 };
std::vector<int> vec1;
std::vector<int> vec2;
std::vector<int> vec3;
for (size_t i = 0; i < vectorOfInts.size(); i++)
{
vec1.push_back(vectorOfInts[i])
if (vectorOfInts[i + 1] is one greater than vectorOfInts[i])
{
vec1.push_back(vectorOfInts[i]);
}
else
{
vec2.push_back(vectorOfInts[i]);
}
}
return 0;
}
您可以使用此算法:创建一个向量向量,其中一个向量包含输入向量的第一个元素。这些是输出向量。对于第一个之后的输入向量的每个元素,如果该元素不是前一个元素+1,则将一个新向量推到输出。将当前元素插入最后一个输出向量。
感谢@eerorika
,我解决了我的问题
代码如下:
std::vector<int> vectorOfInts{ 95, 137, 138, 139, 140, 156, 157, 158, 159 };
std::vector<std::vector<int>> matrixOfIndicies;
matrixOfIndicies.push_back(std::vector<int>(1, vectorOfInts[0]));
for (size_t i = 1; i < vectorOfInts.size(); i++)
{
if (vectorOfInts[i] != (vectorOfInts[i - 1] + 1))
{
matrixOfIndicies.push_back(std::vector<int>(1, vectorOfInts[i]));
}
else
{
matrixOfIndicies.back().push_back(vectorOfInts[i]);
}
}
我有一个包含以下元素的向量:
std::vector<int> vectorOfInts{ 95, 137, 138, 139, 140, 156, 157, 158, 159 };
问题:我正在尝试将每个序列存储在一个新向量中,其中每个序列被定义为一个按顺序递增的值列表(递增 1)。
vectorOfInts
的一些属性:
- 序列的数量已知,但每个序列的长度以及每个序列中的第一个和最后一个元素都是未知的。
- 始终对所有元素进行排序,从最低到最高。
- 序列由数字列表定义,其中下一个数字比前一个数字大 1。
- 序列的最短长度为1。
对于这个例子,有 3 个序列:[95]
、[137, 138, 139, 140]
和 [156, 157, 158, 159]
。 95
是序列 1 的第一个和最后一个元素,137
是序列 2 的第一个元素,140
是序列 2 的最后一个元素,156
是第一个序列 3 的元素,159
是序列 3 的最后一个元素。
我必须为每个序列将序列存储在一个新的不同向量中,即 std::vector<int> vec1 = {95}
、std::vector<int> vec2 = {137, 138, 139, 140}
和 std::vector<int> vec3 = {156, 157, 158, 159}
。
我想我必须遍历 vectorOfInts
并检查下一个索引处的数字是否比当前索引处的数字大 1。我还考虑过根据某些标准对 vectorOfInts
进行分区。
一些伪代码:
#include <vector>
int main()
{
std::vector<int> vectorOfInts{ 95, 137, 138, 139, 140, 156, 157, 158, 159 };
std::vector<int> vec1;
std::vector<int> vec2;
std::vector<int> vec3;
for (size_t i = 0; i < vectorOfInts.size(); i++)
{
vec1.push_back(vectorOfInts[i])
if (vectorOfInts[i + 1] is one greater than vectorOfInts[i])
{
vec1.push_back(vectorOfInts[i]);
}
else
{
vec2.push_back(vectorOfInts[i]);
}
}
return 0;
}
您可以使用此算法:创建一个向量向量,其中一个向量包含输入向量的第一个元素。这些是输出向量。对于第一个之后的输入向量的每个元素,如果该元素不是前一个元素+1,则将一个新向量推到输出。将当前元素插入最后一个输出向量。
感谢@eerorika
,我解决了我的问题代码如下:
std::vector<int> vectorOfInts{ 95, 137, 138, 139, 140, 156, 157, 158, 159 };
std::vector<std::vector<int>> matrixOfIndicies;
matrixOfIndicies.push_back(std::vector<int>(1, vectorOfInts[0]));
for (size_t i = 1; i < vectorOfInts.size(); i++)
{
if (vectorOfInts[i] != (vectorOfInts[i - 1] + 1))
{
matrixOfIndicies.push_back(std::vector<int>(1, vectorOfInts[i]));
}
else
{
matrixOfIndicies.back().push_back(vectorOfInts[i]);
}
}