gpt4 book ai didi

c++ - 成对类型的 map 插入

转载 作者:太空狗 更新时间:2023-10-29 20:38:05 24 4
gpt4 key购买 nike

<int,int> 类型的映射中插入元素时,我们必须再次明确提及这些类型。不是多余的吗?

map<int,int> m1;
//m1.insert(1,1); //NOT OK since the pair type <int,int> not mentioned
m1.insert(pair<int,int>(1,1)); //OK

m1 声明为 <int,int> .在任何情况下,我们会尝试插入除 <int,int> 以外的任何元素吗? e.g. m1.insert(pair<int,string>(1,"boo")) ?如果不是,那么写<int,int>不是多余的吗?插入元素时再次?

编辑 1:

这里用一个小例子来详细说明:

template<typename T1,typename T2>
class Test
{
public:
template<typename T1>
void fun1()
{
cout<<"This is called for T1 templatized fun1"<<endl;
}
template <typename T1,typename T2>
void insert(pair<T1,T2> &obj)
{
cout<<obj.first<<" "<<obj.second<<endl;
}
};

int main()
{
Test <int,int>obj; // Even though i have declared obj as type int,int, i am still able to call insert on type int,string
obj.insert(pair<int,string>(1,"Anurag"));

在这里我们清楚地看到我创建对象 obj 的类型与我调用 insert() 的类型不同。但我不明白成员函数 map::insert() 如何确保类型与创建对象的类型相同?我想到的一种方法是:

template <typename T3=T1,typename T4=T2> //where T1 and T2 are class typenames
void insert2(pair<T3,T4>& obj2)
{
cout<<"Inside insert2 \n";
}

但即使这样也是不允许的,因为这是一个函数模板而不是类模板。我试着查看 ma​​p 的头文件以查看插入声明,但更加困惑。

最佳答案

insert 不是转发函数。只需使用括号来初始化 pair 对象:

m1.insert({1, 1});

在 C++11 中,emplace 将转发参数。

m1.emplace(1, 1);

或者在 C++03 中,make_pair


关于您的修改:

这是一种非常不准确的 map 表示。更准确的表示应该是这样的:

template <typename Key, typename T,
class Compare = std::less<Key>,
class Allocator = std::allocator<std::pair<const Key, T>>>
struct Test
{
using value_type = std::pair<const Key, T>;
using iterator = typename std::allocator_traits<Allocator>::pointer;

std::pair<iterator, bool> insert( const value_type& value )
{
// this calls emplace
}
};

int main()
{
Test<int, int> test;
test.insert(std::pair<int, std::string>(1, "hello"));
}

哪个确实给出了编译器错误。当然,这就是为什么首先提供便利函数 std::make_pair 的原因。

关于c++ - 成对类型的 map 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32794827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com