C ++ - 没有匹配的构造函数

时间:2017-08-26 05:16:00

标签: c++ list struct containers

我想知道是否有人可以帮助我。我试图使用列表或结构作为容器来计算文本文件中字母的频率,并且在查找解决方案时遇到一些麻烦。

我在下面有一些代码并且首先尝试使用temporaryArrayList,但无法弄清楚如何使用指针轻松导航此对象。有没有人有关于arrayListContainer中如何添加和浏览条目的示例?我不像struct那样可扩展容器吗?

如果我可以使用struct我宁愿这样做,但在阅读struct文档后,无法在本网站或网站上找到任何有用的示例。我需要一个std::list变量和一个std::list包含找到的字母的整数,整数是我找到每个字母的次数的计数器。

这里有人可以帮忙吗?

感谢。

到目前为止

代码:

char

3 个答案:

答案 0 :(得分:1)

您可以尝试一下,使用std :: map就像在其他语言中使用dict一样,它更快,更容易,更具诱惑力,如果您想稍后支持UTF编码,已经解决了问题。

但如果您已经知道它只会用于ASCII文本,则还有另一种方法。

您的Universe for ASCII为0-255(实际为0-128,但如果有人使用扩展ASCII,请忽略它)。这意味着我们实际上可以在合理的空间内用

覆盖所有结果
std::array<std::size_t, 256> letters= {0};

然后您可以用

替换内循环
for (int i = 0; i < sizeof(line); i++) {
  ch = toupper(line[i]);
  letter[ch]++;
}

然后写出结果

for (char ch = 'A'; ch <= 'Z'; ch++) {
  std::cout << "Letter: '" << ch << "' occured " << letter[ch] << " times\n";
}

这应该与std::map的空间使用大致相同,但更好的位置和更好的查找时间。你可以使用只有27个字母,但这增加了更多的条件。

答案 1 :(得分:0)

正如其他人在您的问题评论中所建议的那样,std::map就是您所需要的。使用USE master GO xp_readerrorlog 0, 1, N’Server is listening on’ GO ,您可以将出现次数映射到相应的字符。

这是一个简单的例子:

std::map

当您打算使用具有快速插入和移除功能的容器时,std::list很好。访问#include <iostream> #include <string> #include <map> int main() { std::string hello { "Hello, World!" }; std::map<char, std::size_t> letterCounts; for(char ch : hello) letterCounts[ch]++; for(auto& elem : letterCounts) std::cout << elem.first << ": " << elem.second << std::endl; } 内的元素很慢。

答案 2 :(得分:0)

以下是我使用mapstructured binding来计算字母频率的示例

使用了c ++ 17的新功能

  

1.If语句与初始化程序

     
      
  1. 结构绑定
  2.   
#include<iostream>
#include<string>
#include<map>
#include<algorithm>

int main()
{
    std::map<char,int> counterOfChar;
    std::string My("Once upon a time there was a lion who was very funny in reading text and counting them");
    std::for_each(My.begin(), My.end(), [&counterOfChar](const char& n)
    {   //'if' initialization statements are a C++1z extension

        if (auto [iter,success] = counterOfChar.insert(std::make_pair(toupper(n),1) ) ;success == false)
        {
            counterOfChar[iter->first] = ++iter->second;
        }
    });
    for (const auto &[character,count]:counterOfChar)
    {
        std::cout<<character<<" "<<count<<std::endl;
    }
return 0;
}

输出

  17
A 6
C 2
D 2
E 8
F 1
G 2
H 3
I 5
L 1
M 2
N 10
O 5
P 1
R 3
S 2
T 6
U 3
V 1
W 3
X 1
Y 2
Program ended with exit code: 0