东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2290|回复: 0
打印 上一主题 下一主题

[C/C++] 使用zip_iterator迭代器、make_tuple、thrust::get<0>

[复制链接]

1366

主题

1857

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14458
QQ
跳转到指定楼层
楼主
发表于 2021-7-16 10:16:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



使用zip_iterator迭代器、make_tuple、thrust::get<0>


// 1、stl的容器都默认会有迭代器的 通用的
// 2、不同容器的迭代器可以组合成一个元组 thrust::tuple
// 3、迭代器元组可以被封装成zip_iterator  thrust::zip_iterator
// 4、zip_iterator的初始化       thrust::make_tuple
// 5、最终我们使用的就是一个zip_iterator的迭代器对象,像使用stl中的普通迭代器一样
// 6、通过zip_iterator取值 thrust::get<1>(zip_iter[2])





  1. #include <thrust/device_vector.h>
  2. #include <iostream>
  3. #include <thrust/iterator/zip_iterator.h>
  4. #include <thrust/tuple.h>

  5. // 1、stl的容器都默认会有迭代器的 通用的
  6. // 2、不同容器的迭代器可以组合成一个元组 thrust::tuple
  7. // 3、迭代器元组可以被封装成zip_iterator  thrust::zip_iterator
  8. // 4、zip_iterator的初始化       thrust::make_tuple
  9. // 5、最终我们使用的就是一个zip_iterator的迭代器对象,像使用stl中的普通迭代器一样
  10. // 6、通过zip_iterator取值 thrust::get<1>(zip_iter[2])


  11. int main(){
  12.     //使用zip_iterator迭代器、make_tuple、thrust::get<0>
  13.     thrust::device_vector<int> int_v(3);
  14.     int_v[0] = 0; int_v[1] = 1; int_v[2] = 2;
  15.     thrust::device_vector<float> float_v(3);
  16.     float_v[0] = 0.0f; float_v[1] = 1.0f; float_v[2] = 2.0f;
  17.     thrust::device_vector<char> char_v(3);
  18.     char_v[0] = 'a'; char_v[1] = 'b'; char_v[2] = 'c';


  19.     // typedef these iterators for shorthand  stl的迭代器
  20.     typedef thrust::device_vector<int>::iterator   IntIterator;
  21.     typedef thrust::device_vector<float>::iterator FloatIterator;
  22.     typedef thrust::device_vector<char>::iterator  CharIterator;
  23.     // typedef a tuple of these iterators  定义一个 迭代器元组
  24.     typedef thrust::tuple<IntIterator, FloatIterator, CharIterator> IteratorTuple;
  25.     // typedef the zip_iterator of this tuple  迭代器元组外又封装了一层 zip迭代器
  26.     typedef thrust::zip_iterator<IteratorTuple> ZipIterator;
  27.     // finally, create the zip_iterator
  28.     ZipIterator zip_iter(thrust::make_tuple(int_v.begin(), float_v.begin(), char_v.begin()));


  29.     std::cout << "开始使用zip迭代器对象了!" << std::endl;
  30.     // zip_iter[2] = (2, 2.0f, 'c')
  31.     std::cout << thrust::get<0>(zip_iter[2]) << std::endl;  
  32.     std::cout << thrust::get<1>(zip_iter[2]) << std::endl;  
  33.     std::cout << thrust::get<2>(zip_iter[2]) << std::endl;  


  34.     //std::cout << thrust::get<2>(zip_iter[3]) << std::endl;   越界错误


  35.     // *zip_iter;   // returns (0, 0.0f, 'a')
  36.     // zip_iter[0]; // returns (0, 0.0f, 'a')
  37.     // zip_iter[1]; // returns (1, 1.0f, 'b')
  38.     // zip_iter[2]; // returns (2, 2.0f, 'c')
  39.     // thrust::get<0>(zip_iter[2]); // returns 2
  40.     // thrust::get<1>(zip_iter[0]); // returns 0.0f
  41.     // thrust::get<2>(zip_iter[1]); // returns 'b'
  42.     // zip_iter[3] is an out-of-bounds error
  43.    

  44.     return 0;
  45. }




复制代码






让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-6-23 10:46 , Processed in 0.165690 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表