C ++ - 传入向量并返回向量

时间:2013-09-21 14:29:53

标签: c++ vector

对于noob问题很抱歉,但是比方说,我已经有一个用C ++编写的Excel加载项,它接受一个数字并返回数字的平方(比如inputNum和outputNum,其中outputNum = inputNum ^ 2)和现在我需要修改函数,使得输入是一个1xn向量,输出是一个相同大小的向量,数字平方,为了让它工作,我需要修改什么?比如说,我是否需要将输入更改为指针,因为C ++不会将矢量直接作为本机类型(与原始方形函数中的double不同)。

谢谢!

3 个答案:

答案 0 :(得分:3)

std::transform函数是一种很好的方法:

#include <vector>
#include <algorithm>
#include <iostream>

double processElement(double e) {
    return e * e;
}

std::vector<double> processAllElements(const std::vector<double>& in) {
    // The output vector must be constructed to be the same size as the input.
    std::vector<double> out(in.size(), 0);

    // Process each element in the input vector into the output vector.
    // (input is unchanged)
    std::transform(in.begin(), in.end(), out.begin(), &processElement);
    return out;
}

int main() {
    std::vector<double> in;
    in.push_back(1);
    in.push_back(2);

    std::vector<double> out = processAllElements(in);

    std::cout << out[0] << "," << out[1];
}

如果您正在处理值缓冲区的原始指针,您仍然可以使用std::transform

int main() {
    const int n = 3;
    double in[] = {1,2,3};
    double out[n];

    std::transform(in, in+n, out, &processElement);

    std::cout << out[0] << "," << out[1];
}

但是如果你的矢量大小在编译时是不知道的,你最好使用std :: vector为你管理内存。

答案 1 :(得分:2)

“我已经有一个用C ++编写的Excel加载项,只需一个数字并返回数字的平方”

所以让我们说你有功能:

int processElement(int e) {
    ...
}

“现在我需要修改函数,使输入为1xn向量,输出为相同大小的向量”

将它用于std::vector<int>你可以包装这个函数:

void processVector(std::vector<int>& v) {
    for (int i = 0; i < v.size(); ++i)
        v[i] = processElement(v[i]);
}

请注意,要修改某些内容,您不需要将其传递给按值运行并返回它。您可以通过引用传递它。

答案 2 :(得分:2)

我不确定,但你可能不得不走Oper路线。 (这就是我们几乎所有事情都做的事情。)基本上, 你必须下载Excel XLL SDK (http://www.microsoft.com/en-us/download/details.aspx?id=20199 对于Excel 2010,但很多与旧版本兼容 版本 - 你可能已经有了这个,因为 你当然叫xlfRegister) 在其中,您将找到包含文件XLCALL.h(或类似的内容) 那 - 我不在我所有的办公室 信息),它定义了一个结构XLOperXLOper12( 首先是char*表示字符串,第二个表示wchar_t*),还有一些 #define指定其中的内容。你必须申报你的 函数作为获取指向此结构的指针,并返回它。 (PQ,具体取决于您是要使用char还是wchar_t xltype表示字符串。)然后你必须解析 输入:它是一个表(看结构成员XLOper* myFunction( XLOper* tableIn ); ),如果 所以,对于每个细胞,它是一个数字。同样,你必须这样做 使用您的数据创建一个XLOper,并返回指向它的指针。

有很多文档 http://msdn.microsoft.com/en-us/library/office/bb687883%28v=office.14%29.aspx。 它并不完美,但它应涵盖大多数常见情况。 (这比你在许多事情上找到的要好。)

FWIW:你的功能的签名是;

XLCALL.h

我找不到tableIn->xltype的在线副本,但我没有 记住的宏,所以我不能过多的细节, 但粗略地说,你必须从测试是否开始 tableIn->var.array指定数组与否;取决于 要求,您将返回错误或将其视为一个错误 1x1数组,如果没有。如果是数组,XLOper 将包含行数和列数,以及指向的指针 实际数据(将是行*列的单个维度 数组xltype)。对于数组的每个元素,请验证 它是数字(再次,测试var.num),并提取 字段{{1}}中的数字数据。