运算符 += 应用于 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 个ints @Caleth 好的对不起,我想写new int[2] 【参考方案1】:

std::valarray 没有针对异构二进制操作的重载,但它确实具有其他功能的包罗万象,apply

vi.apply([](int * p) return p + 1; );

【讨论】:

非常感谢。这是符合目的的。【参考方案2】:

您可以看到operator+ 重载valarray here。如您所见,没有任何重载适合您尝试执行的操作(添加 int 和指针)。

【讨论】:

是的,这就是为什么我正在寻找适合增加int* 的“类型”。那可能吗?此外,来自操作+= 1int 以标准方式适当转换以增加指针。 @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' 错误

运算符 '!=' 不能应用于类型为 'Task' 和 'int' 的操作数

二元运算符'+'不能应用于'String'和'() -> String'类型的操作数