0

我还在学习 C++,我想出了一个很难理解的表达式。

基本上,它将 cin 输入输入到 istringstream,然后对其进行处理以保留单个单词,并在地图容器“单词”中计数(出现的次数)

编码

std::map<string, int> words;

std::istream_iterator<string> begin(cin); 
std::istream_iterator<string> end;

while(begin != end ) 
   words[*begin++]++;

如果有人可以为我解释 while 循环的代码?我知道最终结果,只是想知道它是如何做到的。谢谢!

4

4 回答 4

3
  1. *开始 - 获取迭代器值
  2. *begin++ - 然后递增迭代器
  3. words[*begin++] - 将步骤 1 中的值传递给 map [] 运算符,这意味着通过键获取值。
  4. words[*begin++]++ - 递增该值。

对于来自 cin 的所有字符串,我们在 map 中搜索一个 int 并将其递增。似乎我们计算相等的字符串。

于 2013-10-18T21:03:11.727 回答
3

关于std::istream_iterator<T>这种类型为流 I/O 提供了一个迭代器接口。在这里,beginandend是迭代器(你可以认为它们是strings 的“虚拟”容器中的迭代器,在输入中表示cin)。

因为begin是用 初始化的cin,所以它将成为我所说的“活动”迭代器:它将从cin第一次被取消引用(如*begin)开始读取,并在每次前增量或后增量后第一次被推迟(begin++) .

因为end没有用任何东西初始化,所以它变成了一个特殊的“结束标记”迭代器,而不是一个活动的迭代器。这个特殊迭代器值的唯一目的是成为活动迭代器在到达文件末尾时可以比较的值。

这样,从文件中读取一系列T(在本例中为string)可以硬塞进容器的普通迭代器遍历中:)

[编辑:澄清的行为operator[]()。]

关于std::map<string, int>您可以将映射视为一种非常通用的数组类型,它可以被小整数以外的东西索引——在这种情况下,是字符串。std::map<K, T>类型重载以返回对 key 参数标识的现有元素的operator[]()引用,具有附加(通常很有帮助,因为它在这里)功能,如果地图中不存在具有该键的元素,它将添加一个默认值(0 代表int)并且将返回对这个全新元素的引用。

于 2013-10-18T21:04:03.877 回答
3

如果您无法理解压缩的单行,只需将其分解为多行并保存中间结果。

std::map<std::string, int> words;

std::istream_iterator<std::string> begin(std::cin); 
//default constructor creates an end of stream iterator
std::istream_iterator<std::string> end_of_stream; 

while(begin != end_of_stream ){
    std::string from_cin = *begin;     //reads from std::cin 
    int &count_ref = words[from_cin];  //can create a new entry 
    count_ref++;                       //increment value in the map
    begin++;                           //advance the stream_iterator
}

用于参考确切语义的相关页面是

isstream_iterator 构造函数

isstream_iterator 运算符 *

地图运算符 []

于 2013-10-18T21:06:26.417 回答
2

std::map 中的下标运算符的行为方式如下。如果没有与键对应的元素,则创建它并初始化为零。否则它返回对值类型的引用。

所以在你的代码表达式中

words[*begin++]

返回 value_type 类型的现有值,它对应于等于 *begin 的字符串对象或 0,因为新对象是使用键 *begin 创建的。之后,返回的值递增。

words[*begin++]++;

也许简单地引用 C++ 标准会更好

T& 运算符[](const key_type& x); 1 效果:如果映射中没有与 x 等效的键,则将 value_type(x, T()) 插入映射中。2 要求:key_type 应为 CopyConstructible,mapped_type 应为 DefaultConstructible。3 返回:对 *this 中 x 对应的 mapped_type 的引用。4 复杂性:对数。

于 2013-10-18T21:05:56.287 回答