在长字符串(随机位置)中的C char搜索
C++ char search in a long string (random locations)
因此,我基本上有一个字符,例如'g',我想在诸如'george'之类的字符串中找到char的实例。扭曲是我想随机返回字符的位置。
我可以使用string.find.finc.find find,它只是返回字符位置的第一个实例,因此在上面的示例中为0。但是也有一个'g'at 4.
我希望我的代码在字符串aka 0或4中随机返回字符的位置,而不仅仅是返回字母的第一个实例。我当时正在考虑使用正则陈述,但我会承认我对我的正则技能不太自信。
任何指导都将不胜感激,谢谢:)
一个解决方案可以遵循以下步骤:
- 找到字符中的所有出现在字符串中,将它们存储在向量 中
- 使用
rand()
函数生成一个随机数,该函数应在矢量-1的0和长度之间。 - 使用生成的数字从匹配向量索引元素并返回结果。
您可以将存储在数组中的所有出现的函数中,然后从该数组中选择一个随机索引。这样的东西...
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
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 构造函数 (C++) 中的 char 指针参数存在问题
- 将上一行添加到 char* 数组中的 char* 常量
- C 如果字符串中的char
- 我们应该在带有 char *func(char *string) 的函数中返回什么?需要简要说明这与 c 中的 char
- 使用C 中的Char数组的指针
- 编程语言中的 char-int 等价性
- 类中的char*p()声明
- Windows 10中的Char*的内存分配问题
- 将字符串转换为c 中的char*时,畸形输出
- 从std :: string转换为c 中的char *
- 有什么方法可以将std :: string :: iterator的值存储在C 中的char *中
- qsort()中的char*和char []之间的混淆
- 从二维数组中的char*初始化c++字符串时,读取大小为1的无效值
- C++ 在模板专用化中从 strcmp() 中的 'char' 到 'const char*' 的无效转换
- 将包含十六进制值的字符串转换为c中的char字节
- C++中的Char*数组内存分配
- 有没有任何方法可以从C++中的char中获取虚拟密钥代码
- Char 数组解释为构造函数中的 char 指针请帮助
- 打印值存储在 C 中的 **char 中