我正在研究一个问题,我必须从更大的向量创建子向量。如果向量中的元素是连续的,我必须创建这些元素的向量。如果存在不连续的元素,则创建该单个元素的向量。我的逻辑如下
vector<int> vect;
for (int nCount=0; nCount < 3; nCount++)
vect.push_back(nCount);
vect.push_back(5);
vect.push_back(8);
vector<int>::iterator itEnd;
itEnd = std::adjacent_find (vect.begin(), vect.end(), NotConsecutive());
仿函数NotConsecutive
如下
return (int first != int second-1);
所以我期待std::adjacent_find
会给我回到迭代器,这样我就可以创建向量一{0,1,2,3},向量二{5}和向量{8}。但我不确定是否有更简单的方法?
编辑:我忘了提及我在循环中有std::adjacent_find
while(itBegin != vect.end())
{
itEnd = std::adjacent_find (vect.begin(), vect.end(), NotConsecutive());
vector<int> groupe;
if( std::distance(itBegin, itEnd) < 1)
{
groupe.assign(itBegin, itBegin+1);
}
else
{
groupe.assign(itBegin, itEnd);
}
if(boost::next(itEnd) != vect.end())
{
itBegin = ++itEnd;
}
else
{
vector<int> last_element.push_back(itEnd);
}
}
它有意义吗?
答案 0 :(得分:3)
我认为这就是所要求的。它不使用adjacent_find()
,而是手动迭代填充包含提取的子向量的vector
的{{1}}。这很简单,IMO。
vector<vector<int>>
输出:
0, 1, 2, 3, 5, 8,
请参阅http://ideone.com/ZM9ssk上的演示。
答案 1 :(得分:2)
由于std::adjacent_find
的限制,您无法以您想要的方式使用它。但它仍然有用。
你可以做的是迭代集合,并在循环中使用std::adjacent_find
,使用最后返回的迭代器(或第一次调用的外部循环迭代器),直到它返回end
。然后你将拥有一套完整的连续元素。然后继续从最后一次调用std::adjacent_find
的外部循环返回一个非结束迭代器。
答案 2 :(得分:1)
老实说,我没有发现使用简单的手工制作循环而不是标准功能的任何明显缺点:
void split(const std::vector<int> &origin, vector<vector<int> > &result)
{
result.clear();
if(origin.empty()) return;
result.resize(1);
result[0].push_back(origin[0]);
for(size_t i = 1; i < origin.size(); ++i)
{
if(origin[i] != origin[i-1] + 1) result.push_back(vector<int>());
result.back().push_back(origin[i]);
}
}