我们可以在C ++中创建一个映射,其值是key的函数吗?

时间:2015-08-17 19:03:58

标签: c++ stl

在C ++ STL中,地图用于将键映射到值。我想知道我们是否可以根据某些函数说明

进行映射
  

地图< int,string>米;
  和value = binary_representation(key)?

2 个答案:

答案 0 :(得分:2)

您可以将任意()对插入std::map,这样您就可以插入( x i f x i ))对函数 f 和任何 x 1 ,..., x n 你喜欢,只要类型匹配。

执行此操作的直接方法可能是使用for循环。

for (const auto& k : keys)
  mapping[k] = f(k);

这是一个完整的例子:

#include <climits>
#include <iomanip>
#include <iostream>
#include <map>
#include <string>

namespace /* anonymous */
{

  std::string
  my_function(const int n)
  {
    const auto size = static_cast<int>(CHAR_BIT * sizeof(int));
    std::string bits {};
    for (auto i = 0; i < size; ++i)
      {
        const auto bit = (n >> (size - i - 1)) & 1;
        bits += (bit ? '1' : '0');
      }
    return bits;
  }

}


int
main()
{
  std::map<int, std::string> reprs {};
  for (auto k = -3; k < 10; ++k)
    reprs[k] = my_function(k);
  for (const auto& kv : reprs)
    std::cout << std::setw(4) << kv.first << "  =>  " << kv.second << '\n';
}

可能的输出:

  -3  =>  11111111111111111111111111111101
  -2  =>  11111111111111111111111111111110
  -1  =>  11111111111111111111111111111111
   0  =>  00000000000000000000000000000000
   1  =>  00000000000000000000000000000001
   2  =>  00000000000000000000000000000010
   3  =>  00000000000000000000000000000011
   4  =>  00000000000000000000000000000100
   5  =>  00000000000000000000000000000101
   6  =>  00000000000000000000000000000110
   7  =>  00000000000000000000000000000111
   8  =>  00000000000000000000000000001000
   9  =>  00000000000000000000000000001001

如果你想遵循优于原始循环的算法的建议,你可以使用std::transformstd::insert_iterator来完成这个技巧。

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <map>
#include <string>
#include <utility>
#include <vector>

namespace /* anonymous */
{

  std::string
  my_function(int);  // as above

}

int
main()
{
  std::vector<int> keys(13);
  std::iota(keys.begin(), keys.end(), -3);
  std::map<int, std::string> reprs {};
  const auto generator = [](const int n){
    return std::make_pair(n, my_function(n));
  };
  std::transform(keys.cbegin(), keys.cend(),
                 std::inserter(reprs, reprs.begin()),
                 generator);
  for (const auto& kv : reprs)
    std::cout << std::setw(4) << kv.first << "  =>  " << kv.second << '\n';
}

但是,我不确定在这个简单的情况下,使用迭代器和算法是否真的有助于代码的可读性。使用keys向量在这里有点令人厌恶。如果你有Boost,你可以用boost::counting_iterator替换它。

答案 1 :(得分:1)

你可以做到,但这完全没有意义。它只是一个劣等std::set<int>,它不能正确保证不变量并消耗更高的内存使用量和运行时间,绝对没有任何好处(除非你真的想要一个缓存)。