C++ std::map 和 std::p air<int, int> 作为键
C++ std::map and std::pair<int, int> as Key
我有以下c++代码:
struct MyStruct
{
int a[2];
int b[2];
};
std::map<std::pair<int, int> , MyStruct*> MyMap;
现在我在MyMap上运行这个循环:
for(std::map<std::pair<int, int> , MyStruct*>::iterator itr = MyMap.begin(); itr != MyMap.end(); ++itr)
{
std::pair<int, int> p (itr->first().second, itr->first().first);
auto i = MyMap.find(p);
if(i != MyMap.end())
{
//do something
}
}
我实际上要做的是通过交换另一对的元素来形成一对,例如,我在MyMap中有一个密钥对(12,16),还有另一个密钥对(16,12);这两个键存在于MyMap中,我很确定。但是当我应用上述技术时,MyMap不返回与交换键对应的值,我猜测MyMap.find(p)匹配key的指针;但是是否有一种方法可以让我强制MyMap.find(p)匹配Key (pair)中的相应值,而不是匹配Key (pair)中的指针?还是我在这里做错了什么?
您的代码中有一些不精确的地方,例如,您的MyStruct
没有复制构造函数,但包含数组,itr->first()
在for循环中,而first
没有调用操作符,等等。下面的代码可以满足您的要求:
#include <array>
#include <map>
#include <utility>
#include <memory>
#include <stdexcept>
#include <iostream>
struct MyStruct
{
std::array<int, 2> a;
std::array<int, 2> b;
};
template <class T, class U>
std::pair<U, T> get_reversed_pair(const std::pair<T, U>& p)
{
return std::make_pair(p.second, p.first);
}
int main()
{
std::map<std::pair<int, int>, std::shared_ptr<MyStruct>> m
{
{
{12, 16},
std::make_shared<MyStruct>()
},
{
{16, 12},
std::make_shared<MyStruct>()
}
};
std::size_t count = 1;
for(const auto& p: m)
{
try
{
auto f = m.at(get_reversed_pair(p.first));
f -> a.at(0) = count++;
f -> b.at(0) = count++;
}
catch(std::out_of_range& e)
{
}
}
for(const auto& p: m)
{
std::cout << p.first.first << ' ' << p.first.second << " - ";
std::cout << p.second -> a.at(0) << ' ' << p.second -> b.at(0) << std::endl;
}
return 0;
}
输出:12 16 - 3 4
16 12 - 1 2
相关文章:
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 将 int 数组转换为 std::vector<int*>
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 从 std::vector<无符号字符>切片中提取 int?
- std::cout输出int时出现编译错误
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- C++如何将 std::vector 转换为 const<int> std::vector<const int>?
- 为什么 std::d eclval<int>() = std::d eclval<int>() 无效?
- 将const int std ::数组的n元素复制到int矢量中.怎么做
- 如何从方法返回静态常量 int std::array?
- 尝试使用 const int std::array 时出错
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- C++ vector<pair<int,int>> std::all_of() 函数问题(重定向到头文件)
- 错误:从"int (*)(std::list<myclass*>, int, char**, char**)"到"int (*)(void*, int, char**, char**)"的
- Boost过载奇怪的行为.' int (int), int (std::string) '与' int (int)