Как было отмечено в комментариях, конструктор
std::vector<T> A{B.begin(), B.end()};
должен работать хорошо, так как он работает для любых двух итераторов. Что касается вопроса «для каких функций STL, которые могут иметь разные распределители?», Существует два типа «разных»:
- Абонентские блоки разных типов.
- Распределители того же типа, но сравниваются как разные.
Для несовместимости по отношению к (1) вы должны увидеть ошибку времени компиляции, потому что система типа поймает ее. Для (2) я не знаю, поймут ли реализации STL возможные проблемы или нет. Основным контейнером/функцией, о которой нужно беспокоиться в этом отношении, являются методы splice
класса list
(и splice_after
методов класса forward_list
), поскольку они перемещают объект, выделенный в одном контейнере, в другой контейнер. Как примечание 265 стандартных заметок C++ 11, контейнеры STL требуют, чтобы распределители сравнивали одинаковые значения, поэтому такое перемещение не должно быть проблемой.
Что касается проблем с разгрузкой, если A выделен простым распределителем STL, то он не может быть построен на стороне хоста и использоваться на стороне сопроцессора. Но B можно использовать с обеих сторон. Вот пример, который создает B using an
offload :: shared_allocator , and constructs
A` из него со стороны сопроцессора.
#pragma offload_attribute (push, _Cilk_shared)
#include <vector>
#include "offload.h"
#include <cstdio>
#pragma offload_attribute (pop)
_Cilk_shared std::vector<int, __offload::shared_allocator<int> > B;
_Cilk_shared void foo() {
#ifdef __MIC__
std::vector<int> A(B.begin(),B.end());
for(auto& x: A)
std::printf("%d\n", x);
#else
std::printf("Host\n");
#endif
}
int main() {
auto y = 1;
for(int i=0; i<10; ++i) {
B.push_back(y);
y *= 10;
}
_Cilk_offload foo();
}
Он должен напечатать:
1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
Это не конструктор копирования вы звоните. –
Хорошо, извините ... Я изменю заголовок – yidiyidawu
Пока они не являются тривиальными указателями, это не 'std :: vector> :: iterator' другой тип, чем' std: : vector > :: iterator'? –