在C ++ STL中,地图用于将键映射到值。我想知道我们是否可以根据某些函数说明
进行映射地图< int,string>米;
和value = binary_representation(key)?
答案 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::transform
和std::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>
,它不能正确保证不变量并消耗更高的内存使用量和运行时间,绝对没有任何好处(除非你真的想要一个缓存)。