c ++中的向量函数(菜鸟)

时间:2017-08-01 09:02:39

标签: c++ vector

所以我试图用一个基本的程序来检查c ++中的国际象棋动作,我需要编写一个函数,用两个向量(c ++风格)作为参数进行向量加法(线性代数风格)并返回一个向量( c ++ style)。

所以我写道:

std::vector<int> vecadd(std::vector<int> a, std::vector<int> b) {           
    if (a.size() == b.size()) {
        std::vector<int> p(a.size);
        for (unsigned int i = 0; i < a.size; i++) p[i] = 0;
        for (int i = 0; i < a.size; i++) p[i] = (a[i] + b[i]);
        return p;
    }
}

我的代码没有编译。我错过了什么吗?

3 个答案:

答案 0 :(得分:1)

您需要size(),而不是size。这是一个功能。在C ++中,当您调用函数时,即使函数不带参数,也需要使用括号。

话虽如此,您的代码中存在严重问题。当向量大小不同时,不返回任何内容。这是未定义的行为。在这种情况下,您的函数会返回随机垃圾。

您需要一种向调用者指示发生错误的方法。例如,您可以抛出异常:

#include <exception>
// ...

std::vector<int> vecadd(std::vector<int> a, std::vector<int> b) {
    if (a.size() != b.size()) {
        throw std::invalid_argument("Vector sizes were not equal.");
    }
    std::vector<int> p(a.size());
    for (unsigned int i = 0; i < a.size(); i++) p[i] = 0;
    for (int i = 0; i < a.size(); i++) p[i] = (a[i] + b[i]);
    return p;
}

(代码中仍然存在问题,但这个问题不在议题中;请参阅评论以了解可以改进的更多内容。)

答案 1 :(得分:0)

你需要小心你正在编写的代码

if (a.size() == b.size()) 

使用x.size() 因为你正在调用一个函数,那你为什么要稍后做p(a.size); ???

你需要这样做:

std::vector<int> p(a.size());

而不是std::vector<int> p(a.size);

当然这同样适用于循环

for (unsigned int i = 0; i < a.size(); i++) p[i] = 0;

答案 2 :(得分:0)

以下版本使用std::transformstd::plus<int>来获得相同的结果:

std::vector<int> vecadd(std::vector<int> const& a, std::vector<int> const& b)
{
    if (a.size() != b.size()) {
        throw std::invalid_argument("Vector sizes were not equal.");
    }

    std::vector<int> result;
    result.reserve(a.size());

    std::transform(a.begin(),
                   a.end(),
                   b.begin(),
                   std::back_inserter(result),
                   std::plus<int>());

    return result;
}

请注意,我更改了您的功能签名。这两个向量通过const ref而不是值传递给函数,以避免复制并表示函数不会修改其中的两个向量。