运算符 += 应用于 std::valarray<int*>
Posted
技术标签:
【中文标题】运算符 += 应用于 std::valarray<int*>【英文标题】:Operator += applied to std::valarray<int*> 【发布时间】:2020-06-09 09:53:13 【问题描述】:示例如下:
#include <iostream>
#include <string>
#include <valarray>
int main()
std::valarray<std::string> vs(2);
// vs[0] += "hello"; // works
// vs[1] += "hello"; // works
vs += "hello"; // works
std::cout << vs[0] << std::endl;
std::cout << vs[1] << std::endl;
std::valarray<int*> vi(2);
vi[0] = new int[2];
vi[0][0] = 0;
vi[0][1] = 1;
vi[1] = new int[2];
vi[1][0] = 2;
vi[1][1] = 3;
std::cout << vi[0][0] << std::endl;
std::cout << vi[1][0] << std::endl;
// vi[0] += 1; // works
// vi[1] += 1; // works
vi += 1; // error: invalid operands of types 'int*' and 'int*' to binary 'operator+'
std::cout << vi[0][0] << std::endl;
std::cout << vi[1][0] << std::endl;
我不明白这个错误,如果有人可以向我解释一下。
有解决办法吗?
最好的问候,
【问题讨论】:
为什么要取一个已经动态分配元素的容器,然后将动态分配的元素放入其中?这有什么可能的目的?我认为需要更多关于您正在尝试做的事情的背景信息,而不仅仅是您目前正在尝试做的事情。 不将int*
存储在std::valarray
中怎么样?你真的想手动改变你的指针地址吗?这绝不是一个好主意。
@underscore_d 和 @Darkproduct :这只是一个简化的示例。我的意图是利用std::valarray
“同时”增加许多指针。
您的程序有未定义的行为。 new int(2);
动态分配一个int
,其值为2
,而不是2 个int
s
@Caleth 好的对不起,我想写new int[2]
【参考方案1】:
std::valarray
没有针对异构二进制操作的重载,但它确实具有其他功能的包罗万象,apply
。
vi.apply([](int * p) return p + 1; );
【讨论】:
非常感谢。这是符合目的的。【参考方案2】:您可以看到operator+
重载valarray
here。如您所见,没有任何重载适合您尝试执行的操作(添加 int
和指针)。
【讨论】:
是的,这就是为什么我正在寻找适合增加int*
的“类型”。那可能吗?此外,来自操作+= 1
的int
以标准方式适当转换以增加指针。
@bou 您可以创建自己的重载并让它做任何您想做的事情。除此之外,你什么也做不了。【参考方案3】:
我最近一次接触 C++ 已经有一段时间了,所以请原谅在术语/细节方面的任何疏忽。
您的错误归结为 valarray 上的 +=
尝试对 valarray 的每个元素执行操作。默认情况下(如果我的记忆没有欺骗我),对于存储在您的 valarray 中的整数指针,没有 +
操作。您需要首先为 int 指针指定一个覆盖的 +
运算符。
另外,为了解释为什么其他操作有效而vi += 1
无效:
vi[0] += 1; // works
vi[1] += 1; // works
这些工作,因为(我不知道你是否打算这样做)你已经在这些 vararray 字段中放置了整数(new int(n)
将创建一个值为 n 的 int),每个都有一个值2。所以 vi[0] 是 2,vi[0] 也是。你也可以写
vi[0] = 2;
vi[1] = 2;
我假设您试图将整数数组存储在 vi[0]
/vi[1]
中,这本来是
vi[0] = new int[2];
vi[1] = new int[2];
问题在于per documentation、vi[0][0] = 0
等...如果这些字段不存在,则只需提示 valarray 创建这些字段,所以当然
std::cout << vi[0][0] << std::endl;
std::cout << vi[1][0] << std::endl;
会起作用的。
【讨论】:
由于运算符+=
确实适用于 int*
,因此我一直在寻找使用此运算符的方法。以上是关于运算符 += 应用于 std::valarray<int*>的主要内容,如果未能解决你的问题,请参考以下文章
应用于三元运算符参数的一元运算符的用法(例如,应用于字符串的 * 运算符参数)
运算符 '>' 不能应用于类型 'string' 和 'number' 错误