【问题标题】:How to copy specific items from a 2d vector using copy_if如何使用 copy_if 从 2d 矢量复制特定项目
【发布时间】:2020-04-23 15:35:42
【问题描述】:

例如,我有一个 2d 向量和一个 1d 向量,我想使用算法库中的 std::copy_if 从每一行复制第一项:

std::vector<std::vector<std::string>> names{ { "Allan", "Daniel", "Maria" }, {"John", "Louis", "Will"}, {"Bill", "Joe", "Nick"}};

所以我们必须将“Allan”、“John”和“Bill”复制到目标向量中,即 dst

std::vector<std::string> dst;

【问题讨论】:

  • 为什么是copy_if?这是一个硬性要求吗?我不明白这里的_if 是什么
  • 使用更少的代码是一个好习惯。
  • 使用算法是很好的做法,但我在问,为什么特别是 copy_if ?我想也许你有理由要求这个,如果没有,这只是你的第一个猜测,也可以,我只是好奇
  • 有时这里的代码会被简化到很难看出实际动机的程度,因此可能是您确实需要使用 copy_if 并且仅在这里的代码不再明显了。没关系,好​​像你得到了你要找的东西

标签: c++ c++11 vector


【解决方案1】:

您应该使用std::transform 而不是std::copy_if

std::transform(names.begin(), names.end(), std::back_inserter(dst),
    [](const std::vector<std::string>& v) { return v[0]; });

【讨论】:

  • 因为目标和源vector 的类型不同。你需要从一个转变为另一个
  • 太棒了。谢谢!
【解决方案2】:

这不是适合您任务的算法。 std::copy_if 复制范围内的元素如果该元素满足某个谓词。

这似乎您需要使用std::copy,但这将是一个问题,因为copy 只是意味着,无条件地复制每个元素。

在您的情况下,合适的算法是std::transform,因为您希望将范围内的每个元素转换为不同的类型。

std::vector<std::string> dst;
std::transform(names.begin(), names.end(),
               std::back_inserter(dst), /* function */);

其中function 将是一个 lambda,它仅返回来自 vector&lt;string&gt; 的第一个 string

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多