Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用C/C++;?_C++_C_Arrays_Range - Fatal编程技术网

C++ 如何使用C/C++;?

C++ 如何使用C/C++;?,c++,c,arrays,range,C++,C,Arrays,Range,例如,有一个大小为10的数组a,包含如下数据: 0.0 0.01 0.02 0.03 5.04 6.05 7.06 13.07 20.08 22.09 int main() { double t[] = { 0.0, 0.01, 0.02, 0.03, 5.04, 6.05, 7.06, 13.07, 20.08, 22.09

例如,有一个大小为10的数组
a
,包含如下数据:

0.0
0.01
0.02
0.03
5.04
6.05
7.06
13.07
20.08
22.09
int main()
{
    double t[] = { 
        0.0,
        0.01,
        0.02,
        0.03,
        5.04,
        6.05,
        7.06,
        13.07,
        20.08,
        22.09
    };
    vector<double> a(t, t + sizeof t / sizeof *t);
    vector<pair<size_t, size_t> > r = getRanges(a);

    for (size_t i = 0; i < r.size(); i++)
        cout << a[r[i].first] << "\t" << a[r[i].second] << endl;

    return 0;
}
如果步长固定为5,则预期数据范围为:

start   end
0.0     0.03
5.04    7.06
13.07   13.07
20.08   22.09

在C/C++中实现它有什么建议吗?如何编程?

您可以使用一个简单的循环,保存最后的开始范围。C++中的简单实现:

#include <utility>
#include <vector>

vector<pair<size_t, size_t> > getRanges (vector<double> array)
{
    vector<pair<size_t, size_t> > result;
    size_t indexLastStart = 0;
    double valueLastStart = array[0];

    for (size_t i = 1; i < array.size(); i++)
    {
        if (array[i] - valueLastStart > 5.0)
        {
            result.push_back(make_pair(indexLastStart, i - 1));
            indexLastStart = i;
            valueLastStart = array[i];
        }
    }

    result.push_back(make_pair(indexLastStart, array.size() - 1));
    return result;
}
#包括
#包括
矢量范围(矢量数组)
{
矢量结果;
大小\u t indexLastStart=0;
双值laststart=数组[0];
对于(size_t i=1;i5.0)
{
结果:向后推_(生成_对(indexLastStart,i-1));
indexLastStart=i;
valueLastStart=数组[i];
}
}
result.push_back(生成_对(indexLastStart,array.size()-1));
返回结果;
}
您可以按如下方式使用此功能:

0.0
0.01
0.02
0.03
5.04
6.05
7.06
13.07
20.08
22.09
int main()
{
    double t[] = { 
        0.0,
        0.01,
        0.02,
        0.03,
        5.04,
        6.05,
        7.06,
        13.07,
        20.08,
        22.09
    };
    vector<double> a(t, t + sizeof t / sizeof *t);
    vector<pair<size_t, size_t> > r = getRanges(a);

    for (size_t i = 0; i < r.size(); i++)
        cout << a[r[i].first] << "\t" << a[r[i].second] << endl;

    return 0;
}
intmain()
{
双t[]={
0.0,
0.01,
0.02,
0.03,
5.04,
6.05,
7.06,
13.07,
20.08,
22.09
};
向量a(t,t+sizeof t/sizeof*t);
向量r=getRanges(a);
对于(大小i=0;icout您可以在一个简单的循环中完成:

#include <stdio.h>

int main(void)
{
    float f, a[] = {0.0, 0.01, 0.02, 0.03, 5.04, 6.05, 7.06, 13.07, 20.08, 22.09};
    size_t i;

    #define N (sizeof a / sizeof a[0])

    for (f = a[0], i = 0; i <= N; i++) {
        if (i == N || a[i] > f + 5.0) {
            printf("%f %f\n", f, a[i - 1]);
            if (i != N) f = a[i];
        }
    }
    return 0;
}
#包括
内部主(空)
{
浮点数f,a[]={0.0,0.01,0.02,0.03,5.04,6.05,7.06,13.07,20.08,22.09};
尺寸i;
#定义N(a的大小/a的大小[0])
对于(f=a[0],i=0;i f+5.0){
printf(“%f%f\n”,f,a[i-1]);
如果(i!=N)f=a[i];
}
}
返回0;
}
#包括
使用名称空间std;
整数乐趣(双*arr,整数n,双*res)
{
int start=0;
int end=0;
int len=0;
对于(int i=开始;iCUT

稍晚,但这里是我的C++的紧凑实现。

template <typename T>
std::vector<std::pair<T, T>> generate_pairs(T *first, T *last)
{
    std::vector<std::pair<T, T>> result(std::distance(first, last) / 2);
    std::generate(std::begin(result), std::end(result), [&first] { return std::make_pair(*first++, *first++); });
    return result;
}

int main(int argc, char *argv[])
{
    double arr[] = { 0.0, 0.01, 0.02, 0.03, 5.04, 6.05, 7.06, 13.07, 20.08, 22.09 };

    auto v = generate_pairs(std::begin(arr), std::end(arr));
    for (const auto &p : v)
        std::cout << "(" << p.first << ", " << p.second << ")" << std::endl;

    return 0;
}
模板
std::向量生成_对(T*第一,T*最后)
{
标准::矢量结果(标准::距离(第一,最后)/2);
std::generate(std::begin(result),std::end(result),[&first]{return std::make_pair(*first++,*first++);});
返回结果;
}
int main(int argc,char*argv[])
{
双arr[]={0.0,0.01,0.02,0.03,5.04,6.05,7.06,13.07,20.08,22.09};
自动v=生成_对(标准::开始(arr),标准::结束(arr));
用于(常数自动和p:v)
std::cout在C#中,您可以使用列表在一行中轻松完成:

float[] subArray = new List<float>(myArray).GetRange(0, 8).ToArray();
float[]子数组=新列表(myArray).GetRange(0,8).ToArray();

建议:使用单循环。那么,你说的是“如果当前值和下一个值之间的差值大于5,则开始新行?”是的,是的。我的英语不好。我想获得起始值和结束值。谢谢你的代码。但是,我似乎不容易理解你的脚本。我没有使用“vector”曾经。你能用其他方式重写它吗?事实上,数组大小未知,数据是从一个文件中连续读取的。我想保留起始值和结束值。@Dong:请看我对C版本的编辑。虽然你从一个文件中读取数据,但你可以将它们存储在数组中(
t
这里),并计算它们的大小。如果您想动态生成结果,您应该将
result[outputSize++]
作业替换为
printf
调用。感谢您的帮助!它运行良好。谢谢。它也运行良好。但我只能选择一个答案。谢谢您的解决方案。