微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我会得到mask_array分配的不同行为?

如何解决为什么我会得到mask_array分配的不同行为?

#include <valarray>  
#include<iostream> 

typedef std::valarray<int>    valarray_t;
typedef std::valarray<bool>   maskarray_t;

int main(void) {

  valarray_t::value_type   ibuf[10] = {0,1,2,3,4,5,6,7,8,9};
  valarray_t               vi1(ibuf,10);
  valarray_t               vi2(ibuf,10);
  

  // Create a valarray of bools for a mask.
  maskarray_t::value_type  mbuf[10] = {0,1};
  maskarray_t              mask(mbuf,10);
  
  maskarray_t::value_type  mbuf2[10] = {0,0};
  maskarray_t              mask2(mbuf2,10);
  
  // test 1:
   vi1[mask] = static_cast<valarray_t> (vi1[mask2]);
   std::cout << "vi1[mask] = vi1[mask2]\n\n" << vi1[0] <<'\t'<<vi1[1]<<'\t' <<vi1[2]<<'\t'<<vi1[3]<<'\t'<<vi1[4]<<'\t'<<vi1[5]<<'\t'<<vi1[6]<<'\t'<<vi1[7]<<'\t'<<vi1[8]<<'\t'<<vi1[9]<<'\t'<< std::endl;

    //test2: 
    std::cout<<"**********************test result=result2"<<std::endl;
    std::mask_array<int>    result1= vi2[mask];
    std::mask_array<int>    result2 = vi2[mask2];

    std::valarray<int>      temp1(result1);
    
    std::cout<<"temp1[0]="<<temp1[0]<<" temp1[1]="<<temp1[1]<<" temp1[2]="<<temp1[2]<<" temp1[3]="<<temp1[3]<<std::endl;
     
     result1=result2;

    std::valarray<int>      temp2(result1);
    std::cout<<"temp2[0]="<<temp2[0]<<" temp2[1]="<<temp2[1]<<" temp2[2]="<<temp2[2]<<" temp2[3]="<<temp2[3]<<std::endl;
     
     
     result1=result2;
     std::cout << "result1= result2\n" << vi2[0] <<'\t'<<vi2[1]<<'\t' <<vi2[2]<<'\t'<<vi2[3]<<'\t'<<vi2[4]<<'\t'<<vi2[5]<<'\t'<<vi2[6]<<'\t'<<vi2[7]<<'\t'<<vi2[8]<<'\t'<<vi2[9]<<'\t'<< std::endl;
     
  return 0;
}

测试上面的代码,我得到了

vi1[mask] = vi1[mask2]

0   1   2   2   3   5   4   7   5   6   

**********************test result=result2

temp1[0]=1  temp1[1]=3 temp1[2]=4 temp1[3]=6

temp2[0]=1  temp2[1]=3 temp2[2]=4 temp2[3]=6

result1= result2

0   1   2   3   4   5   6   7   8   9

据我了解,两个结果都是错误的。

orig:     0 1 2 3 4 5 6 7 8 9 
mask:       ^   ^ ^   ^   ^ ^
mask2:      ^ ^ ^ ^ ^ ^ 
vi1[mask]=vi1[mask2] or result1=result2
          0 1 2 2 2 5 2 7 5 2   

orig [3] = orig [2] /// orig [2]为2,所以orig [3]为2

orig [4] = orig [3] //从上一步开始将orig [3]设置为2,因此将orig [4]设置为2。

...

所以我的问题是:

  1. 为什么我从test1和test2得到不同的输出? test1和test2应该给出相同的结果吗?
  2. 两个输出都错了吗?如果没有,为什么?
  3. 对于test2,原始数组似乎没有更新。为什么?是错误吗?

我使用了一个相当老的编译器和llvm c ++库,尝试找出它是一个错误还是我理解/使用mask_array错误

分享您的想法。 感谢您的任何评论

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?