【问题标题】:Using char to access vector<int>使用 char 访问 vector<int>
【发布时间】:2021-06-06 03:18:42
【问题描述】:

我正在通过 C++ 中的 leetcode 问题进行练习。

我遇到了第 3 个问题。我不太明白为什么您可以使用 char 数据类型访问向量。

例如:

vector<int> chars(128);
char c = 'a';
chars[c]++;

上面的代码只是意味着增加位置'a'处的向量??? 1.

我很困惑。难道我们不应该使用数字索引来访问像数组一样的向量吗?

向量是否将 char 类型隐式转换为十进制?

我们将不胜感激。

【问题讨论】:

  • 因为char是整数类型,就像intunsignedlong等一样。所有整数类型都可以隐式转换为无符号整数类型(通常为std::size_t),用于在标准容器中进行索引,例如std::vector。请记住,char 文字的值(如 'a')是实现定义的,但在任何标准化字符集中都不是零或一(例如,它在与 ASCII 兼容的字符集中具有值 97)和访问容器具有超出范围索引的元素会产生未定义的行为。

标签: c++ vector addressing


【解决方案1】:

假设您的系统使用 ASCII 或 UTF-8 或类似的东西,'a' == 97

所以,这相当于chars[97]++

【讨论】:

  • 所以隐含地,如果我将 char 'a' 提供给向量中的 [],它会将其转换为 ASCII 中的十进制形式?
  • @cswannabe:是的。
  • “那么隐含地,如果我将 char 'a' 提供给向量中的 [],它会将其转换为 ASCII 中的十进制形式?”不,当您提供c = 'a'; 时,您告诉编译器“在我的系统上将 97 分配给 c”。在不使用 ASCII 的不同平台上,该数字可能不同。计算机内存中没有小数,没有符号,只有数字,这就是你解释数字的方式。
  • 实现(编译器和标准库)是否使用 ASCII(或兼容)字符集由实现定义。
【解决方案2】:

难道我们不应该像数组一样使用数字索引来访问向量吗?

谁告诉你的?向量应该像数组一样被访问。这个有std::vector&lt;&gt;::operator[]std::vector&lt;&gt;::at()

向量是否将 char 类型隐式转换为十进制?

C++ 中没有“十进制”类型。在这种情况下,std::vector 不会做任何事情。 operator[] 接收size_type,而char 可以隐式转换为size_type,因此C++ 会将c 转换为适当的类型。 char 不是用来存储字符的。它只是一个数字类型,例如 intlong

【讨论】:

  • 一些风格指南提倡尽可能使用迭代器而不是数组索引。
猜你喜欢
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
相关资源
最近更新 更多