当您在一个字符数组中搜索单词时,是否要调整其大小?

时间:2018-10-07 14:58:08

标签: c++ arrays search char

我正在尝试使用以下方法(使用搜索算法)调整char数组的大小:

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

并以此为例,当我搜索“ app”,“ appl”,“ pple”时,我希望像这样调整char数组的大小:

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

仅使用包含“ app”的单词,例如,“ appl”,如果我搜索“ a”,则char数组不会移动,因为示例中的所有单词都包含“ a”;

我不确定我是否真的很清楚。提前感谢您的帮助!对不起,我的英语!

2 个答案:

答案 0 :(得分:0)

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;                                                                                                                                                                                 
} 

此外,使用原始char*和数组是很老的样式。 在现代C ++中,您应该使用std::string, std::vector, std::array

希望有帮助!

答案 1 :(得分:0)

除非有很好的理由使用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和lambda,我们可以将所需的值收集到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;
}