gpt4 book ai didi

C++ 映射、 vector 、带引用的对

转载 作者:搜寻专家 更新时间:2023-10-31 01:44:31 25 4
gpt4 key购买 nike

我正在尝试在 map 和另一个 vector 之间共享引用,如下面的代码所示:

template <typename T>
void f(T& x) {

std::map<T, vector<int> > mp;
mp[x] = vector<int>(2, 4);

vector< pair<T&, int> > v1;

for (auto& kv : mp) {
v1.push_back( make_pair(kv.first, 0) );
}

}

然后从另一个调用这个函数

int x = 2;
f(x);

但这不能编译。

error: no matching function for call to ‘std::vector<std::pair<int&, int>, std::allocator<std::pair<int&, int> > >::push_back(std::pair<int, int>)’
v1.push_back( make_pair(kv.first, 0) );

有人知道为什么吗?

编辑我能够使事情与

std::reference_wrapper

这是我目前的解决方案。

template <typename T>
void f(T& x) {

std::map<std::reference_wrapper<T>, vector<int> > mp;
mp[x] = vector<int>(2, 4);

vector< pair<T&, int> > v1;

for (auto& kv : mp) {
v1.push_back( make_pair( std::ref(kv.first) , 0) );
}

v1[0].first = 34;
}

int x = 2;
f(x);
cout << x << endl;

打印 34。与基于指针的方法相比,人们认为这种方法有什么缺点吗?

最佳答案

一般来说你可以存储std::pair<T&,int>std::vector ,但您必须正确插入值。 make_pair(x, 0)创建一个 std::pair<T,int>没有引用。

例如,您可以改用初始化列表:

 v.push_back({x,0});

另一种方法是使用 std::ref :

v.push_back(std::make_pair(std::ref(x),0));

示例:

std::vector<std::pair<int&,int>> v;
int a = 1;
v.push_back({a,a});
v.push_back(std::make_pair(std::ref(a),a));
a = 2;
std::cout << v[0].first << " " << v[0].second << std::endl; // will write "2 1"

但是对于您的目的而言,它不会起作用。您不应该获得对 std::map 键的引用. std::map是一个排序的容器,你不能只从外面改变一个键。这会搞乱 std::map 的内部运作.

关于C++ 映射、 vector 、带引用的对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23422743/

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