【发布时间】:2016-12-08 02:43:49
【问题描述】:
我想将一个向量与一个标量相乘。这个向量是使用我的this question 接受的答案创建的,即:
std::vector<int> n(N + 1);
std::iota(begin(n), end(n), 0);
我想将这个向量n 与一个名为npi 的标量(特别是双精度类型,如果它与此处相关)相乘。
我在这里看到了this answer 的上一个问题,但这并没有那么有帮助。我尝试实现它的方式是添加:
std::transform(n.begin(), n.end(), n.begin(),
std::bind1st(std::multiplies<T>(),pin));
到我的 C++ 程序。这返回了编译错误:
error: ‘T’ was not declared in this scope
std::bind1st(std::multiplies<T>(),pin));
我想调用通过将此向量乘以标量 npi 所创建的向量,因此请不要给我将调用此新向量 n 的代码(即覆盖我现有的 n 向量)。
编辑:
如果它会安抚投票结束这个问题的人,这是我的完整程序:
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <cmath>
#include <utility>
#include <unistd.h>
#include <algorithm>
#include <numeric>
/*#include <armadillo>*/
using namespace std;
/*using namespace arma;*/
double N = 1000.0;
double x0 = 0;
double x1 = 100;
double pin = M_PI / double(N);
int main() {
std::vector<int> n(N + 1);
std::iota(begin(n), end(n), 0);
std::transform(n.begin(), n.end(), n.begin(),
std::bind1st(std::multiplies<T>(),pin));
for(double i: n)
{
std::cout << i << '\n' << std::scientific;
}
}
【问题讨论】:
-
你的向量是整数。如果将其乘以双标量,则向量中的值仍为 int - 目标向量需要为双精度,因此如果您要就地修改,请将 vector
更改为 vector -
double(N)是 C 风格的演员表。最好尽可能避免强制转换(这里不需要,因为 N 已经是双精度数了)。如果有必要,最好使用 C++ 风格的static_cast<double>(N)。 -
我 认为
begin(foo)和foo.begin()总是等价的(虽然不确定),在这种情况下最好始终坚持一种风格。这是一个非常次要且可能过于迂腐的观点,但一致性使代码更清晰! -
N已经是双精度数,因此不需要强制转换。 -
请澄清
npi应该是什么--vector<int>、vector<double>或其他?您现有的代码尝试就地修改n(因此提供vector<int>输出)。