1

我仍在学习 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);
                }
            }
        }
  }
4

3 回答 3

3

std::vector<...>确实有方法insert()。实际上,它有多个重载insert()方法,但它们都带有一个迭代器,指示插入传递值的位置。如果可以将值附加到末尾,则可以使用push_back()

peerList.push_back(p);
于 2013-10-29T22:35:31.047 回答
1

对于向量,您需要

peerList.push_back(p);

您可以在cppreference.com上找到有关容器方法的良好概览表。

于 2013-10-29T22:33:48.757 回答
1

我建议您在编写代码时查看文档,这里是std::vector::insert。此函数需要您插入的位置,因此在您的情况下,您需要获取向量的长度并将其传递给函数。

如果您只想将其添加到向量的末尾,您可以使用std::vector::push_backstd::vector::emplace_back(对于 C++11)。由于您标记了 C++11,我假设您使用 C++11,并且emplace_back在您的情况下更推荐使用。它也接受参数并传递给构造函数。

如果要将move对象从旧向量转换为新向量,则需要将其转换为 arvalue reference或使用std::move(实际上只是进行转换)。所以我建议你这样做:

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

或者

peerList.emplace_back(std::move(p));  // You need to include <utility>
于 2013-10-29T22:48:25.163 回答