在长字符串(随机位置)中的C char搜索

C++ char search in a long string (random locations)

本文关键字:中的 char 搜索 位置 字符串 随机      更新时间:2023-10-16

因此,我基本上有一个字符,例如'g',我想在诸如'george'之类的字符串中找到char的实例。扭曲是我想随机返回字符的位置。

我可以使用string.find.finc.find find,它只是返回字符位置的第一个实例,因此在上面的示例中为0。但是也有一个'g'at 4.

我希望我的代码在字符串aka 0或4中随机返回字符的位置,而不仅仅是返回字母的第一个实例。我当时正在考虑使用正则陈述,但我会承认我对我的正则技能不太自信。

任何指导都将不胜感激,谢谢:)

一个解决方案可以遵循以下步骤:

  1. 找到字符中的所有出现在字符串中,将它们存储在向量
  2. 使用rand()函数生成一个随机数,该函数应在矢量-1的0和长度之间。
  3. 使用生成的数字从匹配向量索引元素并返回结果。

您可以将存储在数组中的所有出现的函数中,然后从该数组中选择一个随机索引。这样的东西...

int findX(char x, char* s){
 int *indexes = new int[strlen(s)]; // reserve 
 int count= 0;
 int index = findFirst(x, s, 0);
 while(index!=-1){
    indexes[count++] = index;
    index = findFirst(x, s, index );
 }

 if(count>0){
    int randomIndex = generateRandom(count);
    index = indexes[randomIndex];
 }
 else 
  index = -1;
  delete []indexes;
  return index;
}

一种可能的解决方案是在循环中找到字符的所有实例(只是在所有字符串上迭代并比较字符)。将字母的位置保存在矢量中。

然后随机选择位置向量中的元素之一以返回。

对于随机选择,我建议std::uniform_int_distribution


如果从一个大文件中读取数据(并且使用"大",则是指多毛线或更大的),则不仅仅是字符串上的一个循环,请考虑使用线程。将字符串分为较小的块,并并联每个线程通过其自己的块,从而增加了自己的位置向量。然后,当所有线程完成后,将位置向量合并到一个向量中,然后从收集的向量中随机选择位置。

如果文件为大(Multi-Gabytes),则如果存储在SSD上,则将其读取其块。否则,您可以内存映射文件内容,并使每个线程作为大数组浏览映射的内存。内存映射这样的大文件需要一个64位系统。

您可以使用c pseudo andural generation rand()函数。以下是有关如何使用它的更多详细信息:http://www.cplusplus.com/reference/cstdlib/rand/

鼓励您使用C 11随机发电机http://en.cppreference.com/w/cpp/numeric/random/random