首页 > 解决方案 > 为什么我会得到不同的 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,0,1,1,0,1,0,1,1};
  maskarray_t              mask(mbuf,10);
  
  maskarray_t::value_type  mbuf2[10] = {0,1,1,1,1,1,1,0,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 错误。

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

标签: c++c++14llvmvalarray

解决方案


推荐阅读