Изменить размер массива символов при поиске слова в этом? - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь изменить размер массива символов (с алгоритмом поиска) следующим образом:

char* items[] = { "apple", "apple_2", "banana", "orange" };

и с этим, когда я ищу, например, "app", "appl", "pple«Я хочу изменить размер массива char следующим образом:

char* items[] = { "apple", "apple_2" };

Только с теми словами, которые содержат« app »,« appl », например, если я ищу« a »моего charмассив не перемещается, потому что все слова в моем примере содержат «a»;

Я не уверен, что я действительно ясно.Спасибо заранее за вашу помощь!И извините за мой английский!

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Если нет очень веской причины для использования массива char * (если есть, укажите эту причину, и я постараюсь указать ее в своем ответе), вы должны попытаться использовать возможности языка.

#include <vector>
#include <string>
#include <algorithm>

int main (int argc, char **argv) {
    std::vector<std::string> items{ "apple", "apple_2", "banana", "orange" };

    std::string test_value{"app"};
    auto new_end = std::remove_if(items.begin(), items.end(),
                                  [&test_value](auto idx)->auto {
                                      return idx.find(test_value) == std::string::npos;
                                  });

    items.erase(new_end, items.end());

    return 0;
}

Сначала мы используем std::vector<std::string> для хранения значений.Как уже было отмечено, изменение размера массива проблематично.Затем, используя определенную test_value библиотечную функцию STL std::remove_if и лямбду, мы можем собрать желаемое значение в начале vector.Затем items.erase() усекает вектор.

Чтобы оставить оригинал items без изменений:

#include <vector>
#include <string>
#include <algorithm>

int main (int argc, char **argv) {
    std::vector<std::string> items{ "apple", "apple_2", "banana", "green apple", "orange" };

    std::string test_value{"app"};
    std::vector<std::string> selected_items;
    std::copy_if(items.begin(), items.end(), std::back_inserter(selected_items),
                 [&test_value](auto idx)->auto {
                     return idx.find(test_value) != std::string::npos;
                 });

    return 0;
}
0 голосов
/ 07 октября 2018

Статические массивы в C ++ не могут быть изменены во время выполнения.Чтобы достичь своей цели, посмотрите на std::vector стандартный контейнер.Он может динамически изменять свой размер.

Вот пример того, как вы можете реализовать свою задачу:

#include <iostream>                                                                                                                                                                           
#include <vector>                                                                                                                                                                             

std::vector<std::string> filter(const std::vector<std::string>& strings, const std::string& pattern)                                                                                          
{                                                                                                                                                                                             
   std::vector<std::string> matchItems;                                                                                                                                                       
   for (const auto& elem : strings)                                                                                                                                                           
   {                                                                                                                                                                                          
       if (elem.find(pattern) != std::string::npos)                                                                                                                                           
       {                                                                                                                                                                                      
           matchItems.push_back(elem);                                                                                                                                                        
       }                                                                                                                                                                                      
   }                                                                                                                                                                                          
   return matchItems;                                                                                                                                                                         
}                                                                                                                                                                                             

int main()                                                                                                                                                                                    
{                                                                                                                                                                                             
    std::vector<std::string> v { "apple", "apple_2", "banana", "orange" };                                                                                                                    
    auto filtered = filter(v, "app");                                                                                                                                                         
    for (const auto& elem : filtered)                                                                                                                                                         
    {                                                                                                                                                                                         
        std::cout << elem << " ";                                                                                                                                                             
    }                                                                                                                                                                                         

    return 0;                                                                                                                                                                                 
} 

Более того, использование raw char* и массивов довольно старое.В современном C ++ лучше использовать std::string, std::vector, std::array

Надеюсь, это поможет!

...