简体   繁体   English

错误:从 &#39;const char&#39; 转换为非标量类型 &#39;std::string&#39; {aka &#39;std::__cxx11::basic_string<char> &#39;} 请求

[英]error: conversion from ‘const char’ to non-scalar type ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} requested

I want to count letters in const string&, and save result in map.我想计算 const string& 中的字母,并将结果保存在地图中。
But compiler throws an error:但是编译器会抛出一个错误:

error: conversion from 'const char' to non-scalar type 'std::string' {aka 'std::__cxx11::basic_string'} requested错误:请求从 'const char' 转换为非标量类型 'std::string' {aka 'std::__cxx11::basic_string'}

My code:我的代码:

map<string, int>& MakeWordCounter (const string& word, map<string, int>& counter) {
    for (string i : word) {
        counter[i] = count(word.begin(), word.end(), i);
    }
}

Why this error is happening and how to fix it?为什么会发生此错误以及如何解决?

The dereferenced iterator of word has the type char , we can't convert it to string. word的解引用迭代器具有char类型,我们不能将其转换为字符串。 And the function declaration can be more clear to directly return the map.并且函数声明可以更清晰直接返回map。

The key type here is char, we don't need to use a string type, its misleading and is a waste.这里的关键类型是char,我们不需要使用string类型,它会误导和浪费。

std::map<char, size_t> MakeWordCounter(const std::string& word) {
  std::map<char, size_t> counts;
  for (auto ch : word) {
    counts[ch]++;
  }
  return counts;
}

Or we can use STL algorithm instead of loop:或者我们可以使用 STL 算法而不是循环:

std::map<char, size_t> MakeWordCounter2(const std::string& word) {
  return std::accumulate(word.begin(), word.end(), std::map<char, size_t>{},
                         [](auto init, char cur) {
                           init[cur] += 1;
                           return init;
                         });
}

You may doubt the second version's performance, so I add the benchmark here, the two versions are generally the same.你可能会怀疑第二个版本的性能,所以我在这里添加基准,两个版本大致相同。

https://quick-bench.com/q/OSzzp70rBSdlpivEMmMIj0aGJfU https://quick-bench.com/q/OSzzp70rBSdlpivEMmMIj0aGJfU

Online demo在线演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 错误:从“Mstream”转换为非标量类型“std::string {aka std::basic_string<char> }' 请求</char> - error: conversion from ‘Mstream’ to non-scalar type ‘std::string {aka std::basic_string<char>}’ requested 'operator*' 不匹配(操作数类型为 'const string' {aka 'const std::__cxx11::basic_string<char> '})</char> - no match for 'operator*' (operand type is 'const string' {aka 'const std::__cxx11::basic_string<char>'}) 错误:传递&#39;const字符串{aka const std :: __ cxx11 :: basic_string <char> }&#39;作为&#39;this&#39;参数 - Error: passing ‘const string {aka const std::__cxx11::basic_string<char>}’ as ‘this’ argument 错误:为&#39;operator std::string {aka std::__cxx11::basic_string 指定的返回类型<char> }&#39; - Error:return type specified for 'operator std::string {aka std::__cxx11::basic_string<char>}' 获取“错误:无法转换 'std::__cxx11::string* {aka std::__cxx11::basic_string<char> *}' 到 'const char*' 错误,同时将路径作为参数传递</char> - Getting "error: cannot convert 'std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}' to 'const char*' error while passing a path as argument 错误:从&#39;const char [10]&#39;转换为非标量类型&#39;std :: fstream {aka std :: basic_fstream <char> }&#39;请求 - error: conversion from 'const char [10]' to non-scalar type 'std::fstream {aka std::basic_fstream<char>}' requested 从&#39;std :: wstring {aka std :: basic_string <wchar_t> }&#39;转换为非标量类型&#39;UString {aka std :: basic_string <char> }&#39; - conversion from ‘std::wstring {aka std::basic_string<wchar_t>}’ to non-scalar type ‘UString {aka std::basic_string<char>}’ 从&#39;void&#39;转换为非标量类型&#39;std :: pair <std::basic_string<char, std::char_traits<char> - conversion from ‘void’ to non-scalar type ‘std::pair<std::basic_string<char, std::char_traits<char> 错误:无法从“向量”转换“标签” <std::vector<std::__cxx11::basic_string<char> &gt;&gt;' 到 ' 向量<std::__cxx11::basic_string<char> &gt;' </std::__cxx11::basic_string<char></std::vector<std::__cxx11::basic_string<char> - error: could not convert 'tab' from 'vector<std::vector<std::__cxx11::basic_string<char> >>' to 'vector<std::__cxx11::basic_string<char>>' 错误:basic_istream <char> 使用getline时转换为非标量类型cxx11 :: string - Error: basic_istream<char> to non-scalar type cxx11::string while using getline
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM