C++ 将元素从一个向量移动到另一个向量

C++ Moving elements from one vector to another

本文关键字:向量 一个 移动 另一个 元素 C++      更新时间:2023-10-16

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

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

peerList.push_back(p);

对于向量,您需要

peerList.push_back(p);

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

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

如果你只想把它添加到向量的末尾,你可以使用 std::vector::p ush_back 或 std::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>