C++ 在c+中计算字符数和出现时间+;

C++ 在c+中计算字符数和出现时间+;,c++,C++,假设我有一个包含文本消息的字符数组,例如: "abccddcabbef" 现在我想计算每个角色的角色数和出现时间。结果将是两个阵列: char a[6] = {'a', 'b', 'c', 'd', 'e', 'f'} // array of character int b[6] = {2, 3, 3, 2, 1, 1} // appear time 哪种方法最好 对不起我的英语 好吧,如果假设输入字符串str小于128,那么您知道总会有小于strlen(str)的唯一字符 因此,

假设我有一个包含文本消息的字符数组,例如:

"abccddcabbef"
现在我想计算每个角色的角色数和出现时间。结果将是两个阵列:

char a[6] = {'a', 'b', 'c', 'd', 'e', 'f'}    // array of character
int b[6] = {2, 3, 3, 2, 1, 1}   // appear time
哪种方法最好


对不起我的英语

好吧,如果假设输入字符串
str
小于128,那么您知道总会有小于
strlen(str)
的唯一字符

因此,您可以执行以下操作:

std::string str = "abcabx";
char a[str.length()];
unsigned size[str.length()];

// zero arrays
memset(a, 0,  str.length());
memset(size, 0, str.length() * sizeof(unsigned));

unsigned num_unique = 0;
for (char x : str) {
  unsigned i = 0;
  while (a[i] != '\0' && a[i] != x) ++i;
  num_unique = std::max(i+1, num_unique);
  a[i] = x;
  ++size[i];
}

for (unsigned i = 0; i < num_unique; ++i) {
  std::cout << a[i] << " - " << size[i] << std::endl;
}
std::string str=“abcabx”;
字符a[str.length()];
无符号大小[str.length()];
//零阵列
memset(a,0,str.length());
memset(size,0,str.length()*sizeof(unsigned));
无符号num_unique=0;
用于(字符x:str){
无符号i=0;
而(a[i]!='\0'&&a[i]!=x)++i;
num_unique=std::max(i+1,num_unique);
a[i]=x;
++尺寸[i];
}
for(无符号i=0;istd::cout我的答案基于这样一个假设,即您事先知道结果所需的数组长度。如果您事先不知道这些信息,我建议使用字符列表或ArrayList

但是,根据你的问题,我会这么做

int aCurrentIndex = 0;
for (i = 0; i  < origArray.length; i++) {
    if (!a.contains(origArray[i])) {
        a[aCurrentIndex] = origArray[i];
        b[aCurrentIndex] = 1;
        aCurrentIndex++;
    }
    else {
        b[a.indexOf(origArray[i])] = b[a.indexOf(origArray[i])] + 1;
    }
}

为什么不这样做:创建一个
std::unordered_map
,其键为字符,值为int

例如:

    unordered_map<char, int> map;
    string inputText;
    for (int i = 0; i < inputText.size(); ++i)
        {
           map[inputText[i]]++;
        }
无序地图;
字符串输入文本;
对于(int i=0;i

现在,您可以遍历此地图,您可以找到到地图键为止看到的实际字符,以及到地图值为止每个字符出现的次数。

请发布您写下的代码,并指出您面临的问题…问题是,如果我使用e固定大小为128(如果文本消息包含所有ASCII字符),如果文本消息只包含上面提到的几个字符,那么将有许多无用的空格。@Tuankhao1996使用一个
std::vector
,分别两个。除了数组之外,我不允许使用任何东西!:(因此,如果只使用数组,128的大小是唯一的方法?我看到了你的问题,我的初步回答是肯定的。在这种情况下,先用ascii字符构建数组“a”,然后用所有值0构建数组“b”,大小128。然后只运行代码的else部分,因为不需要在上构建a从原始字符中查找当前字符,并增加b中的字符数。这是因为在添加值之前必须声明数组大小。如果可以使用列表,则在循环原始字符之前调整结果数组的大小不会妨碍您。是否确实不能使用列表获取值,然后调用您的List.toArray()一旦它都是从原始数组构建的?原始数组肯定可以作为数组开始,但a和b可以作为列表开始,然后转化为数组。例如,arrA=lstA.toArray();是的!我不允许在我的项目中包含任何库。似乎我没有选择。谢谢!:)@tuankhoa,如果这里的一个答案对你有帮助,请接受它作为帮助其他人的答案。谢谢!
    unordered_map<char, int> map;
    string inputText;
    for (int i = 0; i < inputText.size(); ++i)
        {
           map[inputText[i]]++;
        }