Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
长字符串(随机位置)中的C++字符搜索_C++_String_Char - Fatal编程技术网

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

长字符串(随机位置)中的C++字符搜索,c++,string,char,C++,String,Char,所以基本上我有一个字符,比如“g”,我想在字符串中找到这个字符的实例,比如“george”。我想随机返回角色的位置 我让它使用string.find,它只返回字符位置的第一个实例,因此在上面的示例中它将是0。但在4级也有一个“g” 我希望我的代码随机返回字符串中字符的位置,即0或4,而不是只返回字母的第一个实例。我曾想过使用正则表达式,但我承认我对自己的正则表达式技能不是很有信心 >非常感谢,谢谢: < P>可以使用C++伪随机生成RAND函数。以下是有关如何使用它的更多详细信息: 你鼓励使用

所以基本上我有一个字符,比如“g”,我想在字符串中找到这个字符的实例,比如“george”。我想随机返回角色的位置

我让它使用string.find,它只返回字符位置的第一个实例,因此在上面的示例中它将是0。但在4级也有一个“g”

我希望我的代码随机返回字符串中字符的位置,即0或4,而不是只返回字母的第一个实例。我曾想过使用正则表达式,但我承认我对自己的正则表达式技能不是很有信心


<> >非常感谢,谢谢:

< P>可以使用C++伪随机生成RAND函数。以下是有关如何使用它的更多详细信息:


<>你鼓励使用C++ 11随机生成器< /P> < P>你可以使用C++伪随机生成RAND函数。以下是有关如何使用它的更多详细信息:


我们鼓励您使用C++11随机生成器

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

查找字符串中出现的所有字符,并将其存储在向量中 使用rand函数生成一个随机数,该随机数应介于0和向量长度-1之间。 使用生成的数字从匹配向量索引元素并返回结果。
一种解决方案可以遵循以下步骤:

查找字符串中出现的所有字符,并将其存储在向量中 使用rand函数生成一个随机数,该随机数应介于0和向量长度-1之间。 使用生成的数字从匹配向量索引元素并返回结果。
一种可能的解决方案是在循环中查找字符的所有实例,只需迭代所有字符串并比较字符。将字母的位置保存在向量中

然后在要返回的位置向量中随机选择一个元素

对于随机选择,我建议

如果从大文件中读取数据,并且用大i表示多兆字节或更大,而不是只在字符串上使用单个循环,则考虑使用线程。将字符串分成更小的块,并让每个线程并行地通过它自己的块,添加到它自己的位置向量中。然后,当所有线程完成后,将位置向量合并为单个向量,并从收集的向量中随机选择位置


如果文件是非常大的数GB,那么如果它存储在SSD上,线程也会读取它的块。否则,您可以对文件内容进行内存映射,让每个线程作为一个大数组遍历映射的内存。但是,内存映射如此大的文件需要64位系统。

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

然后在要返回的位置向量中随机选择一个元素

对于随机选择,我建议

如果从大文件中读取数据,并且用大i表示多兆字节或更大,而不是只在字符串上使用单个循环,则考虑使用线程。将字符串分成更小的块,并让每个线程并行地通过它自己的块,添加到它自己的位置向量中。然后,当所有线程完成后,将位置向量合并为单个向量,并从收集的向量中随机选择位置


如果文件是非常大的数GB,那么如果它存储在SSD上,线程也会读取它的块。否则,您可以对文件内容进行内存映射,让每个线程作为一个大数组遍历映射的内存。但是,内存映射如此大的文件需要64位系统。

您可以编写一个函数,将所有出现的字符存储到一个数组中,然后从该数组中选择一个随机索引。 像这样的

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

您可以编写一个函数,将所有出现的字符存储到一个数组中,然后从该数组中选择一个随机索引。 像这样的

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

首先,只需找到所有位置并将它们放入一个数组中。。然后对该数组调用random..首先找到所有位置并将它们放入数组。。然后在那个数组上调用random..我非常喜欢这个主意,我一定会尝试一下。谢谢我非常喜欢这个主意,我一定会尝试一下。谢谢我唯一的问题是,我的字符串是通过一个文件读入的,可能非常长,因此如果它必须逐字符循环整个字符串,那么速度会很慢。@Lainezor那么您认为find函数是做什么的呢?由于字符串没有排序,它基本上必须从开头到结尾循环所有字符。如果搜索是一个问题,那么你应该考虑其他的数据结构或算法。看看我更新的答案,我想我从来没有想过
但它确实做到了这一点。谢谢你的帮助,我在这个问题上挣扎了太久了,哈哈。我唯一的问题是,我的字符串是通过一个文件读取的,可能真的很长,所以如果它必须逐字符循环整个字符串,它会很慢。@Lainezor,你认为find函数做什么?由于字符串没有排序,它基本上必须从开头到结尾循环所有字符。如果搜索是一个问题,那么你应该考虑其他的数据结构或算法。请看我更新的答案以获得可能的解决方案。我想我从未真正考虑过它,但它确实做到了这一点。谢谢你的帮助,我为此挣扎了太久,哈哈。