交换映射中的键和值
exchange key and vals in a map
我有一个映射(xi,f(xi)),我的f(xi)也严格增加。我需要这样交换键和值
我的函数输入:
带有
的map//keys : x0, x1, x2, ..., xn
// vals : f(x_0) f(x1), f(x2), ..., f(xn)
函数的输出:带有
的地图// key : left_val f(x_0) f(x1), ..., f(xn-1)
// vals : x0, x1, x2, ..., xn
(这里left_val是一个输入参数,我知道它小于f(x0))。我知道我可能没有使用正确的结构,但我确实需要log(n)的插入和有序键的唯一性……
你将如何有效地实现这一点(即不复制地图)?
提前感谢。
这是一种不寻常的情况,因为您想要更改std::map
键,通常禁止这样做,以避免更改会破坏顺序。如果您确信自己能够确保这个不变性,那么您可以这样修改std::map
:
#include <iostream>
#include <map>
int main()
{
typedef std::map<double, double> Mdd;
Mdd m;
m[1] = 4;
m[2] = 6.5;
m[3] = 7.2;
m[4] = 9.3;
m[5] = 12;
double x = 2.3;
for (Mdd::iterator i = m.begin(); i != m.end(); ++i)
{
double old_second = i->second;
i->second = i->first;
const_cast<double&>(i->first) = x;
x = old_second;
}
for (Mdd::const_iterator i = m.begin(); i != m.end(); ++i)
std::cout << i->first << "->" << i->second << 'n';
}
输出:2.3->1
4->2
6.5->3
7.2->4
9.3->5
所有这些都是使用const_cast
来坚持对键的写访问。严格地说,我怀疑标准不会要求在这种黑客行为之后的实现工作,但在实践中,我无法想象一个实现不这样做。您需要决定如何处理x
的最终值-在您的问题中,这将是f(xn)
…根据你的问题,我已经把它丢弃了。
在效率方面,这将在map
上进行一次顺序传递,如果希望使用这样的容器,这是不可避免的。没有映射的复制或额外的堆分配。在转换之后,根据上面关于标准不保证支持的警告,您可以期望有一个"正常"的有效映射,其中可以安全地插入和删除元素。
在新映射中插入新条目时,使用二进制搜索算法进行插入。每次插入将是O(log n),重新创建映射的总时间应该是O(n log n)。
相关文章:
- 通过从矢量中获取键和与映射中的键对应的值来创建映射
- 在具有 std::p air 键和值的映射中添加 b2vec2
- 如何将键和值从映射传输到另一个映射?
- 如何通过键和值以及在C 中的结果映射中比较两个地图?我们有任何STL API吗?
- 多重映射的每个元素是否同时包含键和值
- 如何正确使用带有智能指针和自定义类的映射作为键和值
- 如何使用 boost 连接映射的键和值,特别是如果值是结构
- 对象来映射键和值
- C++STL映射键和值工作不正常
- 使用C++中的函数指针映射枚举键和值
- 从变量映射键和值初始化
- 键和值属于同一类型的多重映射是否有任何意义
- 如何在C++中创建将键和值作为结构的映射
- 使用结构作为映射的键和值.find() 操作给出错误
- 从常量迭代器到映射向量,获取映射向量中映射元素的键和值
- std::映射绑定到所有键和值的堆的分配器
- 如何在c++中比较映射中的键和值
- 在c++中如何从另一个完整映射中插入键和值到空映射
- 在c++中交换映射的键和值
- 交换映射中的键和值