Presumably you’re not worried about efficiency with cout.
In general, either realization is triggering under-the-hood device->host copies. Neither is particularly efficient, since a separate device->host copy will occur with each loop iteration, for either method.
If you want to make this “more efficient”, transfer the entire vector at once, in a single operation, then print out from there:
thrust::host_vector<point> C3(10);
thrust::device_vector<point> D3 = C3;
point *d_c3=thrust::raw_pointer_cast(D3.data());
thrust::host_vector<point> H3 = D3; // copy entire vector to host, all at once
//print from host data
for(int i=0;i<H3.size();i++)
cout<<"\n"<<H3[i].x;
cout<<endl;
this will be “more efficient” from the standpoint of device->host copying
For this trivial example, you could have just as easily used C3 instead of H3, but presumably in your real code, some modification of the data occurs in the D3 vector, which you then want to print out.