【问题标题】:C++ removing a element in string array which appears 5 timesC ++删除出现5次的字符串数组中的元素
【发布时间】:2022-01-16 22:42:27
【问题描述】:

这是我的代码,我无法找到删除数组中所有 Apple elem 的方法。我能够数出数组中的苹果数。我希望有人可以帮助...

    string items[10] = { "Apple", "Oranges", "Pears", "Apple", "bananas", "Apple", "Cucumbers", "Apple", "Lemons", "Apple" };
     

    //Counts the total amount of apples
    int n = sizeof(items) / sizeof(items[0]);
    cout << "Number of times Apple appears : "
        << count(items, items + n, "Apple");

    //remove the element Apple from array
    if (string items[].contains("Apple"))
    {
        items[].remove("Apple");
    }

【问题讨论】:

  • 您想对删除的项目做什么?因为删除它们后您仍然会有一个包含 10 个元素的数组。如果您使用的是std::vector,您可以提醒他们并使用std::erase_if 缩小向量。
  • 您永远无法“删除”数组中的元素。
  • 无关:sizeof(items) / sizeof(items[0]); 返回 size_t,而不是 int 所以 auto n = std:size(items);` 会很好

标签: c++ arrays string


【解决方案1】:

您可能会有以下选择:

  1. 遍历您的项目数组并将您的 "Apple" 字符串替换为空字符串。
  2. 使用 std::vector 的字符串以及是否 a) 使用项目数组对其进行初始化,然后调用 std::erase_if (C++20) 以删除 "Apple" 字符串,或者 b) 将其初始化为不包含元素,然后调用std::copy_ifstd::back_inserter 以附加非"Apple" 字符串。

[Demo]

#include <algorithm>  // copy_if, transform
#include <iostream>  // cout
#include <string>
#include <vector>  // erase_if

int main()
{
    {
        std::string items[10] = { "Apple", "Oranges", "Pears", "Apple", "bananas", "Apple", "Cucumbers", "Apple", "Lemons", "Apple" };
        std::transform(std::begin(items), std::end(items), std::begin(items), [](auto& s) {
            return (s == "Apple" ? "" : s); 
        });
        for (const auto& s : items) { std::cout << s << ", "; }
        std::cout << "\n";
    }

    {
        const std::string items[10] = { "Apple", "Oranges", "Pears", "Apple", "bananas", "Apple", "Cucumbers", "Apple", "Lemons", "Apple" };
        std::vector<std::string> v{std::cbegin(items), std::cend(items)};
        std::erase_if(v, [](auto& s) { return s == "Apple"; });
        for (const auto& s : v) { std::cout << s << ", "; }
        std::cout << "\n";
    }

    {
        const std::string items[10] = { "Apple", "Oranges", "Pears", "Apple", "bananas", "Apple", "Cucumbers", "Apple", "Lemons", "Apple" };
        std::vector<std::string> v{};
        std::copy_if(std::cbegin(items), std::cend(items), std::back_inserter(v), [](auto& s) {
            return s != "Apple";
        });
        for (const auto& s : v) { std::cout << s << ", "; }
    }
}

// Outputs:
//
//   , Oranges, Pears, , bananas, , Cucumbers, , Lemons, , 
//   Oranges, Pears, bananas, Cucumbers, Lemons, 
//   Oranges, Pears, bananas, Cucumbers, Lemons, 

【讨论】:

  • 所以使用字符串向量比我做的要好得多。非常感谢你的帮助。基本上是 C++ 新手,我想使用良好的做法。
  • 确实,尽可能尝试使用 STL 数据结构和算法。很高兴能提供帮助。
  • +1 表示std::copy_if。此外,大多数 autos 可以是 const,所以最好让它们 const 正确。
  • @digito_evo 谢谢。更新了答案。
【解决方案2】:

删除数组中多个元素的最简单、最有效的方法是创建一个新数组:

#include <iostream>

using namespace std;

int main()
{
    string items[10] = { "Apple", "Oranges", "Pears", "Apple", "bananas", "Apple", "Cucumbers", "Apple", "Lemons", "Apple" };
    
    string new_items[10];
    int new_size = 0;
    
    // construct new array
    for (int i = 0; i < sizeof(items)/sizeof(string); i++) {
        if ("Apple" != items[i]) {
            new_items[new_size++] = items[i];
        }
    }

    // print new array
    for (int i = 0; i < new_size; i++) {
        cout << new_items[i] << " ";
    }
    cout << endl;

    return 0;
}

【讨论】:

    猜你喜欢
    • 2020-06-10
    • 2022-08-16
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2020-05-18
    相关资源
    最近更新 更多