所以我试图用一个基本的程序来检查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;
}
}
我的代码没有编译。我错过了什么吗?
答案 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::transform
和std::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而不是值传递给函数,以避免复制并表示函数不会修改其中的两个向量。