【问题标题】:How to delete the selected random data in std::vector?如何删除 std::vector 中选定的随机数据?
【发布时间】:2021-11-22 10:00:00
【问题描述】:

如何删除vector中选中的随机数据?

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> shuf{ 1, 2, 3, 4, 5 };
    int random = shuf[rand() % shuf.size()];
    std::cout << random; // to get the random data in shu
    std::find(shuf.begin(), shuf.end(), random);
    shuf.erase(random);

    for (int k = 0; k < shuf.size(); k++)
    {
        std::cout << shuf.at(k) << ' ';
        break;
    }
}

比如shuf向量中的数据是{ 1, 2, 3, 4, 5 }那么随机数据比如4这样4会在向量中被删除,所以向量中的数据就是shuf{ 1,2,3,5 }

这是我得到的错误

no matching function for call to 
'find(std::vector<int>::iterator, std::vector<int>::iterator, int&)'

【问题讨论】:

  • 你没有使用std::find(shuf.begin(), shuf.end(), random)的结果。
  • 这是您尝试运行的确切代码吗?如果是,那么您在std::find(shuf.begin(), shuf.end(), random) 之后缺少一个分号。此外,erase 采用 vector&lt;T&gt;::iterator 而不是 int
  • Erase 想要一个 find 返回的迭代器,但只有在 find() 没有返回“end”迭代器时才擦除它。 (在这种情况下它总是会成功。)但是,这种方法并不好,因为 find 是一种线性算法,并且您已经知道要擦除的元素的索引,因此您不必再次查找它- - 只需记住 rand() % shuf.size() 的结果,然后调用 vec.erase(vec.begin() + index);

标签: c++ algorithm c++11 stdvector c++-standard-library


【解决方案1】:

这样

shuf.erase(random);

您将int 类型的random 传递给std::vector::erase,并且不要使用std::find(shuf.begin(), shuf.end(), random); 的结果。

std::vector::erase 期望 有效的迭代器 指向要删除的元素,而不是实际的元素。因此,错误。

来自 cppreference.com,std::vector::erase 需要

参数

pos - 要移除的元素的迭代器。 迭代器pos 必须有效且可取消引用。因此end() 迭代器(有效,但不可取消引用)不能用作pos 的值。

因此,您可能需要以下内容:

#include <algorithm> // std::find

auto iter = std::find(shuf.begin(), shuf.end(), random);
if (iter != shuf.end())
    shuf.erase(iter);

(See a Demo)

请注意,您需要包含&lt;algorithm&gt;(也是其他必需的)标头,以便编译器查看算法函数std::find

【讨论】:

  • 您好,非常感谢您的回答,但我试过这个我遇到了同样的错误
  • @woofMaranon 你也需要#include
  • @JeJo 考虑到 OP 的代码,我们是否需要 if 条件?
  • @AshutoshAswal 否。但是一旦您在检查之前更改了代码,它也不应该破坏代码库。
  • @JeJo 这很有道理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2013-07-11
  • 2013-09-27
  • 2020-12-26
  • 2013-10-08
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多