C++ C++;映射、向量、带引用的对

C++ C++;映射、向量、带引用的对,c++,reference,containers,C++,Reference,Containers,我尝试在地图和另一个向量之间共享引用,如下代码所示: 但这并不适用于编译 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_pa

我尝试在地图和另一个向量之间共享引用,如下代码所示:

但这并不适用于编译

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) );
这是我目前的解决方案

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;
}
模板
空f(T&x){
std::map-mp;
mp[x]=向量(2,4);
向量v1;
用于(自动和千伏:兆帕){
v1.推回(形成成对(标准::参考(千伏优先),0);
}
v1[0],第一个=34;
}

intx=2;
f(x);

不能有引用的容器

引用必须在声明时初始化,声明引用容器意味着以后填充该容器

你可以用指针代替。非(内存)拥有指针被认为是有效的C++风格。 第二种选择是


由于类型不匹配:

vector< pair<T&, int> > v1;   // value_type is pair<int&, int>
//      ^^^^^^^^^^^^^
vectorv1;//值类型为pair
//      ^^^^^^^^^^^^^

v1.向后推_(使_对(kv.first,0));
//^^^^^^^^^^^^^^^^^^^^^^^对

对int的左值引用不能用右值初始化。

如果您真的想引用映射和对向量中的同一对象,那么最好使用基于指针的解决方案。如果原始类型是基于堆栈的,则次集合可以使用原始指针(因为它不具有键对象的所有权,因此不应在保留或销毁键对象中扮演任何角色)来遵从它。尽管在同步管理这两个集合时必须小心,以避免任何悬空指针


这就是说,取决于你为什么要这样做,如果它是一个简单的
int
,它可能不值得这么复杂。

一般来说,你可以将
std::pair
存储在
std::vector
中,但你必须正确插入值。
make_pair(x,0)
创建一个无引用的
std::pair

例如,您可以使用初始值设定项列表:

 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::vector v;
INTA=1;
v、 推回({a,a});
v、 推回(std::make_pair(std::ref(a),a));
a=2;

std::cout很可能有一个容器来存储
@丹维尔真的吗?引用既不可复制也不可移动;这同样适用于包含引用的对。所有的标准容器都要求所包含的对象是可复制的或可移动的。@JamesKanze:见我的答案。
shared\u ptr
一般来说绝对不是一个好的解决方案;据推测,如果他想要引用,对象将在其他地方管理——最有可能是静态或自动生存期。原始指针是这里最好的解决方案。@JamesKanze:是的,如果是这样的话,你是对的-原始指针将是一个更好的解决方案。我会更新答案以澄清。
std::reference_wrapper
vector< pair<T&, int> > v1;   // value_type is pair<int&, int>
//      ^^^^^^^^^^^^^
v1.push_back( make_pair(kv.first, 0) );
//            ^^^^^^^^^^^^^^^^^^^^^^      pair<int, int>
 v.push_back({x,0});
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"