[关闭]
@zhengyuhong 2015-06-09T11:56:09.000000Z 字数 3708 阅读 1184

tuple

C++11 STL


tuple

  1. template <class... Types> class tuple;

  tuple元组定义了一个有固定数目元素的容器,其中的每个元素类型都可以不相同,这与其他容器有着本质的区别
  

tuple::tuple

  1. constexpr tuple();
  2. tuple (const tuple& tpl) = default;
  3. tuple (tuple&& tpl) = default;
  1. template <class... UTypes>
  2. tuple (const tuple<UTypes...>& tpl);
  3. template <class... UTypes>
  4. tuple (tuple<UTypes...>&& tpl);
  1. explicit tuple (const Types&... elems);
  2. template <class... UTypes>
  3. explicit tuple (UTypes&&... elems);
  1. template <class U1, class U2>
  2. tuple (const pair<U1,U2>& pr);
  3. template <class U1, class U2>
  4. tuple (pair<U1,U2>&& pr);

std::tuple是简单结构体的一个替换品,如

  1. struct Person{
  2. char name[20];
  3. int age;
  4. int id;
  5. };
  6. typedef std::tuple<char*,int ,int> Person;

example

  1. // tuple constructors
  2. #include <iostream> // std::cout
  3. #include <utility> // std::make_pair
  4. #include <tuple> // std::tuple, std::make_tuple, std::get
  5. int main ()
  6. {
  7. std::tuple<int,char> first; // default
  8. std::tuple<int,char> second (first); // copy
  9. std::tuple<int,char> third (std::make_tuple(20,'b')); // move
  10. std::tuple<long,char> fourth (third); // implicit conversion
  11. std::tuple<int,char> fifth (10,'a'); // initialization
  12. std::tuple<int,char> sixth (std::make_pair(30,'c')); // from pair / move
  13. std::cout << "sixth contains: " << std::get<0>(sixth);
  14. std::cout << " and " << std::get<1>(sixth) << '\n';
  15. return 0;
  16. }

make_tuple

  1. template<class... Types>
  2. tuple<VTypes...> make_tuple (Types&&... args);

make_tuple与构造函数无异,就是简单一些,不需要写模版参数,利用auto以及类型推导即可。

  1. #include <iostream>
  2. #include <tuple>
  3. #include <functional>
  4. int main()
  5. {
  6. auto first = std::make_tuple (10,'a'); // tuple < int, char >
  7. const int a = 0; int b[3]; // decayed types:
  8. auto second = std::make_tuple (a,b); // tuple < int, int* >
  9. auto third = std::make_tuple (std::ref(a),"abc"); // tuple < const int&, const char* >
  10. std::cout << "third contains: " << std::get<0>(third);
  11. std::cout << " and " << std::get<1>(third);
  12. std::cout << std::endl;
  13. return 0;
  14. }

get

  1. template <size_t I, class... Types>
  2. typename tuple_element< I, tuple<Types...> >::type& get(tuple<Types...>& tpl) noexcept;
  3. template <size_t I, class... Types>
  4. typename tuple_element< I, tuple<Types...> >::type&& get(tuple<Types...>&& tpl) noexcept;
  5. template <size_t I, class... Types>
  6. typename tuple_element< I, tuple<Types...> >::type const& get(const tuple<Types...>& tpl) noexcept;

  获取tuple元素或者元素的引用,然后改变元素的值
example

  1. #include <iostream>
  2. #include <tuple>
  3. int main ()
  4. {
  5. std::tuple<int,char> mytuple (10,'a');
  6. std::get<0>(mytuple) = 20;
  7. std::cout << std::get<0>(mytuple) << " and " << std::get<1>(mytuple)<<std::endl;
  8. auto &r = std::get<0>(mytuple);
  9. r = 30;
  10. std::cout << std::get<0>(mytuple) << " and " << std::get<1>(mytuple)<<std::endl;
  11. auto a = std::get<0>(mytuple);
  12. a = 40;
  13. std::cout << std::get<0>(mytuple) << " and " << std::get<1>(mytuple)<<std::endl;
  14. return 0;
  15. }

tie

  1. template<class... Types>
  2. tuple<Types&...> tie (Types&... args) noexcept;
  1. #include <iostream> // std::cout
  2. #include <tuple> // std::tuple, std::make_tuple, std::tie
  3. int main ()
  4. {
  5. int myint;
  6. char mychar;
  7. std::tuple<int,float,char> mytuple;
  8. mytuple = std::make_tuple (10, 2.6, 'a'); // packing values into tuple
  9. std::tie (myint, std::ignore, mychar) = mytuple; // unpacking tuple into variables
  10. myint += 1;
  11. std::cout << "myint contains: " << myint << '\n';
  12. std::cout << "mychar contains: " << mychar << '\n';
  13. std::tie (myint, std::ignore, mychar) = mytuple; // unpacking tuple into variables
  14. std::cout << "myint contains: " << myint << '\n';
  15. return 0;
  16. }

  通过tie解包后,mytuple中三个值会自动赋值给三个变量。
解包时,我们如果只想解某个位置的值时,可以用std::ignore占位符来表示不解某个位置的值。tie解包的解出来的是引用,可以通过引用改变tuple元素的值。

tuple_cat

  1. template <class... Tuples>
  2. tuple<CTypes...> tuple_cat (Tuples&&... tpls);//Concatenate tuples

example

  1. // tuple_cat example
  2. #include <iostream> // std::cout
  3. #include <utility> // std::pair
  4. #include <string> // std::string
  5. #include <tuple> // std::tuple, std::tuple_cat, std::get
  6. int main ()
  7. {
  8. std::tuple<float,std::string> mytuple (3.14,"pi");
  9. std::pair<int,char> mypair (10,'a');
  10. auto myauto = std::tuple_cat ( mytuple, std::tuple<int,char>(mypair) );
  11. std::cout << "myauto contains: " << '\n';
  12. std::cout << std::get<0>(myauto) << '\n';
  13. std::cout << std::get<1>(myauto) << '\n';
  14. std::cout << std::get<2>(myauto) << '\n';
  15. std::cout << std::get<3>(myauto) << '\n';
  16. return 0;
  17. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注