fork(2) download
  1. #include <string>
  2. #include <iostream>
  3. #include <array>
  4. #include <utility>
  5. #include <unordered_map>
  6. using namespace std;
  7.  
  8. class my_class
  9. {
  10. bool empty = false;
  11. public:
  12. my_class(int) { cerr << "c'tor\n"; }
  13. my_class() { cerr << "default c'tor\n"; }
  14. my_class(const my_class&) { cerr << "copy c'tor\n"; }
  15. my_class(my_class&& o) { cerr << "move c'tor\n"; o.empty = true;}
  16. ~my_class() { cerr << (empty ? "Empty": "Filled") << " d'tor\n"; }
  17.  
  18. };
  19.  
  20.  
  21. int main ( int , char *[])
  22. {
  23.  
  24. const string key{"key"};
  25.  
  26.  
  27. // OK
  28. {
  29. unordered_map<string, std::array<my_class, 2>> contig_sizes;
  30. std::cerr << "Precreated value\n";
  31. array<my_class, 2> value{1, 2};
  32. std::cerr << "Now emplace:\n";
  33. contig_sizes.emplace(key, value);
  34. std::cerr << "Done:\n";
  35. }
  36.  
  37. // OK
  38. {
  39. unordered_map<string, std::array<my_class, 2>> contig_sizes;
  40. std::cerr << "\nEmplace key, casted value:\n";
  41. contig_sizes.emplace(key, std::array<my_class, 2>{1, 2});
  42. std::cerr << "Done:\n";
  43. }
  44.  
  45. // OK use Very inefficient insert
  46. {
  47. unordered_map<string, std::array<my_class, 2>> contig_sizes;
  48. std::cerr << "\nVery inefficient insert:\n";
  49. contig_sizes.insert({key, {1,2}});
  50. std::cerr << "Done:\n";
  51. }
  52.  
  53. // OK use inefficient insert
  54. {
  55. unordered_map<string, std::array<my_class, 2>> contig_sizes;
  56. std::cerr << "\nInefficient insert:\n";
  57. contig_sizes.insert({key, std::array<my_class, 2>{1,2}});
  58. std::cerr << "Done:\n";
  59. }
  60.  
  61. // OK use ugly insert
  62. {
  63. unordered_map<string, std::array<my_class, 2>> contig_sizes;
  64. std::cerr << "\nUgly insert:\n";
  65. contig_sizes.insert(pair<const string, array<my_class, 2>>{key, array<my_class, 2>{1, 2}});
  66. //contig_sizes.insert(make_pair(key, array<my_class, 2>{1, 2}));
  67. std::cerr << "Done:\n";
  68. }
  69.  
  70. // OK emplace with the correct pair type (typedef)
  71. {
  72. typedef pair<const string, array<my_class, 2>> pair_type;
  73. unordered_map<string, std::array<my_class, 2>> contig_sizes;
  74. //std::cerr << "\nPieceswise construct with pair typedef:\n";
  75. //pair_type p{std::piecewise_construct,
  76. // std::forward_as_tuple(string(key)),
  77. // std::forward_as_tuple(std::array<my_class, 2>({1, 2}))};
  78. std::cerr << "\nEmplace with pair typedef:\n";
  79. // c'tor removed with extra cast
  80. contig_sizes.emplace(pair_type{key, {1, 2}});
  81. std::cerr << "Done:\n";
  82. }
  83.  
  84. // OK ugly emplace with the correct pair type (typedef)
  85. {
  86. typedef pair<const string, array<my_class, 2>> pair_type;
  87. unordered_map<string, std::array<my_class, 2>> contig_sizes;
  88. std::cerr << "\nUgly Emplace with pair typedef:\n";
  89. // c'tor removed with extra cast
  90. contig_sizes.emplace(pair_type{key, std::array<my_class, 2>{1, 2}});
  91. std::cerr << "Done:\n";
  92. }
  93.  
  94.  
  95. // compile error
  96. //contig_sizes.emplace(key, {{1,2}});
  97. }
Success #stdin #stdout #stderr 0s 3468KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Precreated value
c'tor
c'tor
Now emplace:
copy c'tor
copy c'tor
Done:
Filled d'tor
Filled d'tor
Filled d'tor
Filled d'tor

Emplace key, casted value:
c'tor
c'tor
move c'tor
move c'tor
Empty d'tor
Empty d'tor
Done:
Filled d'tor
Filled d'tor

Very inefficient insert:
c'tor
c'tor
copy c'tor
copy c'tor
copy c'tor
copy c'tor
Filled d'tor
Filled d'tor
Filled d'tor
Filled d'tor
Done:
Filled d'tor
Filled d'tor

Inefficient insert:
c'tor
c'tor
move c'tor
move c'tor
copy c'tor
copy c'tor
Filled d'tor
Filled d'tor
Empty d'tor
Empty d'tor
Done:
Filled d'tor
Filled d'tor

Ugly insert:
c'tor
c'tor
move c'tor
move c'tor
move c'tor
move c'tor
Empty d'tor
Empty d'tor
Empty d'tor
Empty d'tor
Done:
Filled d'tor
Filled d'tor

Pieceswise construct with pair typedef:
c'tor
c'tor
move c'tor
move c'tor
Empty d'tor
Empty d'tor

Emplace with pair typedef:
c'tor
c'tor
copy c'tor
copy c'tor
move c'tor
move c'tor
Empty d'tor
Empty d'tor
Filled d'tor
Filled d'tor
Done:
Filled d'tor
Filled d'tor
Filled d'tor
Filled d'tor

Ugly Emplace with pair typedef:
c'tor
c'tor
move c'tor
move c'tor
move c'tor
move c'tor
Empty d'tor
Empty d'tor
Empty d'tor
Empty d'tor
Done:
Filled d'tor
Filled d'tor