C++ 遇到零时对数组进行除法

C++ 遇到零时对数组进行除法,c++,arrays,algorithm,C++,Arrays,Algorithm,我想将一个数组划分为多个(或一个,可能是零个)数组,如下例所示: array=[011234003030567]->array1=[111234]array2=[3]array3=[33]array4=[567] 我的天真方法是首先从左、右删除零,然后使用两个迭代器查找每个子数组的开始和结束,并使用向量构造函数构建子数组并将其传递给函数。但我知道我的方法是幼稚和低效的,所以我希望能就如何更有效地处理这个问题提出一些建议 谢谢大家 这也是我的方法代码(a是母数组): for(int i=0;i=0

我想将一个数组划分为多个(或一个,可能是零个)数组,如下例所示:

array=[011234003030567]->array1=[111234]array2=[3]array3=[33]array4=[567]

我的天真方法是首先从左、右删除零,然后使用两个迭代器查找每个子数组的开始和结束,并使用向量构造函数构建子数组并将其传递给函数。但我知道我的方法是幼稚和低效的,所以我希望能就如何更有效地处理这个问题提出一些建议

谢谢大家

这也是我的方法代码(a是母数组):

for(int i=0;i=0;i--){
如果(a[i]!=0)
打破
a、 擦除(a.begin()+i);
}
自动开始=a.begin();
自动结束=a.开始()+1;
对于(int i=0;i
在我建议的以下方法中,您可以通过单个顺序扫描检索子阵列,而无需在开始或结束时排除零:

std::vector<std::vector<int>> arrays;
std::vector<int> currentArray;
for (int i = 0; i < a.size; i++)
{
    if (a[i] == 0 || i == a.size - 1)
    {
        if (currentArray.size() != 0)
        {
            arrays.push_back(currentArray);
            currentArray.clear();
        }
    }
    else
    {
        currentArray.push_back(a[i]);
    }
}
std::向量数组;
矢量电流阵列;
for(int i=0;i
解决此问题的方法之一是创建一个包含所有零元素索引的辅助数组(在实现中,使用了
常量迭代器,而不是索引)。这个问题不需要创建这样的辅助阵列就可以解决,但它的优点是,您可以发现要提前创建的子阵列的数量。方法如下:

迭代输入数组并将零元素的索引放入辅助数组,
InputArray=
[0,1,1,2,3,4,0,3,0,3,3,0,5,6,7]

数组包含零元素索引=
[0,6,8,11]

如上所述,有四个除法器(零索引项),将输入数组划分为
3
子数组,最后一个零位于索引
11
处,这不是输入数组的最后一个元素,这就是为什么要再创建一个子数组,所以总子数组=
4
,有关其他详细信息,请参阅代码

#include <iostream>

#include <vector>

#include <iterator>
#include <algorithm>

using std::cout;

std::vector<std::vector<int>> splitAtZero(const std::vector<int>& arr){

    std::vector<std::vector<int>::const_iterator> divider;
    divider.reserve(std::max<std::size_t>(arr.size() / 4, 2));

    for(std::vector<int>::const_iterator it = arr.cbegin(), endIt = arr.cend(); endIt != it; ++it){

        if(0 == *it){
            divider.push_back(it);
        }
    }

    if(divider.empty()){
        return {arr};
    }

    if(arr.size() == divider.size()){
        return {};
    }

    std::size_t numOfSubArray = (divider.size() - 1) + (arr.cbegin() != divider.front() ? 1 : 0) +
            (arr.cend() != divider.back() ? 1 : 0);

    std::vector<std::vector<int>> subArr;
    subArr.reserve(numOfSubArray);

    std::vector<int>::const_iterator it = arr.cbegin();

    for(std::vector<int>::const_iterator divderIt : divider){

        if(divderIt - it > 0){

            subArr.emplace_back(it, divderIt);
        }

        it = divderIt + 1;
    }

    if(arr.cend() != it){

        subArr.emplace_back(it, arr.cend());
    }

    return subArr;
}

int main(){

    std::string comma("");

    for(std::vector<int>& subArr : splitAtZero({0, 1, 1, 2, 3, 4, 0, 3, 0, 3, 3, 0, 5, 6, 7})){

        cout<< comma<< "[";

        std::copy(subArr.cbegin(), subArr.cbegin() + (subArr.size() - 1), std::ostream_iterator<int>(cout, ", "));

        cout<< subArr.back()<< "]";
        comma = ", ";
    }

    cout<< '\n';
}
#包括
#包括
#包括
#包括
使用std::cout;
std::vector splitAtZero(常数std::vector&arr){
向量除法器;
分隔器保留(标准::最大(arr.size()/4,2));
对于(std::vector::const_迭代器it=arr.cbegin(),endIt=arr.cend();endIt!=it;+it){
如果(0==*它){
分隔器。推回(it);
}
}
if(divider.empty()){
返回{arr};
}
if(arr.size()==divider.size()){
返回{};
}
std::size\u t numo子数组=(divider.size()-1)+(arr.cbegin()!=divider.front()?1:0)+
(arr.cend()!=分隔符.back()?1:0);
std::向量子空间;
子阵储备(numf子阵);
std::vector::const_迭代器it=arr.cbegin();
for(std::vector::const_迭代器divderIt:divider){
如果(divderIt-it>0){
子母舰后置阵地(it,divderIt);
}
it=divderIt+1;
}
if(arr.cend()!=it){
子母舰后置阵地(它,到达中心();
}
返回子雷达;
}
int main(){
std::字符串逗号(“”);
for(std::vector&subar:splitAtZero({0,1,1,2,3,4,0,3,0,3,0,5,6,7})){

cout请添加语言标记您可以创建一个
std::vector result;
,并(多次)使用算法,如允许这样做,而无需从源代码中删除零。您可能需要将最后一个
currentArray
推送到
arrays
@VladFeinstein,谢谢。
#include <iostream>

#include <vector>

#include <iterator>
#include <algorithm>

using std::cout;

std::vector<std::vector<int>> splitAtZero(const std::vector<int>& arr){

    std::vector<std::vector<int>::const_iterator> divider;
    divider.reserve(std::max<std::size_t>(arr.size() / 4, 2));

    for(std::vector<int>::const_iterator it = arr.cbegin(), endIt = arr.cend(); endIt != it; ++it){

        if(0 == *it){
            divider.push_back(it);
        }
    }

    if(divider.empty()){
        return {arr};
    }

    if(arr.size() == divider.size()){
        return {};
    }

    std::size_t numOfSubArray = (divider.size() - 1) + (arr.cbegin() != divider.front() ? 1 : 0) +
            (arr.cend() != divider.back() ? 1 : 0);

    std::vector<std::vector<int>> subArr;
    subArr.reserve(numOfSubArray);

    std::vector<int>::const_iterator it = arr.cbegin();

    for(std::vector<int>::const_iterator divderIt : divider){

        if(divderIt - it > 0){

            subArr.emplace_back(it, divderIt);
        }

        it = divderIt + 1;
    }

    if(arr.cend() != it){

        subArr.emplace_back(it, arr.cend());
    }

    return subArr;
}

int main(){

    std::string comma("");

    for(std::vector<int>& subArr : splitAtZero({0, 1, 1, 2, 3, 4, 0, 3, 0, 3, 3, 0, 5, 6, 7})){

        cout<< comma<< "[";

        std::copy(subArr.cbegin(), subArr.cbegin() + (subArr.size() - 1), std::ostream_iterator<int>(cout, ", "));

        cout<< subArr.back()<< "]";
        comma = ", ";
    }

    cout<< '\n';
}