2013-10-29 78 views
0

我仍然在学习C++的一些操作。C++将元素从一个向量移动到另一个向量

我想将矢量的某些元素移动到另一个矢量(根据矢量是否包含在unordered_set中)。

但是,我不断收到一个错误,即向量类没有带引用变量的插入方法。具体而言,这样的错误:

In file included from TorrentTrackerCommManager.h:10:0, 
       from TorrentTrackerCommManager.cpp:1: 
PeerList.h: In member function ‘void PeerList::addPeers(std::vector<Peer*>)’: 
PeerList.h:51:24: error: no matching function for call to ‘std::vector<Peer>::insert(Peer&)’ 
     peerList.insert(*p); 

我正在使用的代码是在这里:

class PeerList { 

    private: 

     /* List holding all of the Peer objects. */ 
     std::vector<Peer> peerList; 

     /* Set holding all of the Peer objects. */ 
     std::unordered_set<Peer, PeerHash> peerSet; 

    public: 

     void addPeers(std::vector<Peer *> newPeers) { 

      std::vector<Peer *>::iterator it; 
      for (it = newPeers.begin(); it != newPeers.end(); ++it) { 

       Peer p = **it; 

       //If we don't already have that peer 
       if (peerSet.find(p) != peerSet.end()) { 

        //add him 
        peerList.insert(p); 
        peerSet.insert(p); 
       } 
      } 
     } 
    } 
+1

向量具有'push_back'。 – Marius

+1

小心你的术语。你不是从一个向量移动元素到另一个向量,你正在拷贝它。此举将是一个非常不同的行动。 –

+0

这段代码是否正确粘贴? peerList是类型为的向量,而在addPeers()中,您迭代了(即指向Peer的指针),但在insert()时不会取消引用它。所以你可能需要做peerList.insert(* p)/ push_back(* p) – JvO

回答

2

std::vector<...>确实有insert()方法。实际上,它有多个重载insert()方法,但它们都采用迭代器来指示插入传入值的位置。如果它是确定附加价值到了最后,你可以使用push_back()

peerList.push_back(p); 
1

对于一个矢量,你需要

peerList.push_back(p); 

您可以找到有关容器很好地概括表方法cppreference.com

1

我建议你看看单证,而你写你的代码,在这里它是为std::vector::insert。这个函数需要你插入的位置,所以你需要获得矢量的长度并传递给函数。

如果您只是想将其添加到向量的末尾,您可以使用std::vector::push_backstd::vector::emplace_back(对于C++ 11)。既然你标记了C++ 11,我假设你使用C++ 11,而emplace_back更适合你的情况。它需要参数并传递给构造函数。

如果你想move一个对象从旧的向量到新的,你需要把它投到rvalue reference或使用std::move(实际上只是铸造)。因此,我建议你这样做:

peerList.emplace_back((Peer&&) p); 

peerList.emplace_back(std::move(p)); // You need to include <utility> 
相关问题