2016-01-04 2 views
1

Работы на 14,04 системе Kubuntu с GCC 4.8.4 я столкнулся с следующей проблемой:соответствия между элементами массива с использованием подталкивания multi_array итератора

Использованием зЬм: вектор, я могу назначить между векторными элементами с помощью итератора:

std::vector<float> v ; 
v.push_back(0.0) ; 
v.push_back(1.0) ; 
auto vv = v.begin() ; 
vv[0] = vv[1] ; 
assert (v[0] == v[1]) ; 

используя повышающий multi_array, это не удается:

typedef boost::multi_array<float, 1> array_type; 
boost::array<array_type::index, 1> shape = {{ 2 }}; 
array_type a(shape) ; 
a[0] = 0.0 ; 
a[1] = 1.0 ; 
auto aa = a.begin() ; 
aa[0] = aa[1] ; 
assert (a[0] == a[1]) ; // fails, a[0] is unmodified 

я могу обойти эту проблему, используя другую идиому, как

aa[0] = *(aa+1) ; 

Но код, который я хочу использовать с multi_array, написан с использованием назначений типа, который не работает. Что мне не хватает?

ответ

2

Причина в том, что итератор, участвующий в operator[], для boost::multi_array - это input iterator, который не требуется изменять.

+0

Извините, мой комментарий был полным вздором! (Хотя входные итераторы действительно не требуют, чтобы op-'[]' существовал.) –

+0

Действительно. Документ boost сообщает, что «Это итератор над значениями A. Если NumDims == 1, то он моделирует итератор случайного доступа. В противном случае он моделирует Итератор с обратным доступом, читаемый итератор, записываемый итератор и выходной итератор. ' Таким образом, в этом случае это будет Итератор с произвольным доступом. –