问题 需要关于C ++向量使用的示例


鉴于C ++向量如下:

vector<double> weight;
weight.resize(128, 0);      

重量可以用作:

weight['A'] = 500.98;
weight['P'] = 455.49;

这意味着什么,以及如何使用这些值?有人能举个例子吗?


4366
2017-08-14 13:41


起源



答案:


字符文字(如“A”和“P”)可以使用ASCII值自动转换为整数。所以'A'是65,'B'是66,等等。

所以你的代码是这样的:

weight[65] = 500.98;
weight[80] = 455.49;

你想要这样做的原因是权重数组与字符有关。如果是这样,那么为字符文字赋予权重会使代码比分配给整数更具可读性。但它只是用于“文档”,编译器将其视为整数。


7
2017-08-14 13:46



好的,我知道,这些字符文字可以转换为整数 - ladyfafa
为了计算ASCII字符的出现次数(例如在计算霍夫曼编码树之前),没关系,但是将字符集更改为保持多于低位ASCII将使该方案无效。 - Matthieu M.


答案:


字符文字(如“A”和“P”)可以使用ASCII值自动转换为整数。所以'A'是65,'B'是66,等等。

所以你的代码是这样的:

weight[65] = 500.98;
weight[80] = 455.49;

你想要这样做的原因是权重数组与字符有关。如果是这样,那么为字符文字赋予权重会使代码比分配给整数更具可读性。但它只是用于“文档”,编译器将其视为整数。


7
2017-08-14 13:46



好的,我知道,这些字符文字可以转换为整数 - ladyfafa
为了计算ASCII字符的出现次数(例如在计算霍夫曼编码树之前),没关系,但是将字符集更改为保持多于低位ASCII将使该方案无效。 - Matthieu M.


代码相当于:

weight[65] = 500.98;
weight[80] = 455.49;

当然,只有当矢量至少包含81个元素时才有效。


5
2017-08-14 13:45



谢谢,我已经纠正了 - ladyfafa
它看起来像是128,所以我们应该没问题。 - Martin York


所以我理解char文字变成了Integers。 C ++是否支持扩展的ASCII表? 例如,如果我有一个

char * blah = 'z'+'z';

会发生什么 ??? 例如。

'z' = 122 in ASCII

因此

'z'+'z' = 244  ?? or ?? 

1
2017-08-14 13:58



试试:) char * blah ='z';不会编译,因为你混合了一个char('z')和一个char *(blah)。如果使用char blah:它取决于“char”是否为编译器的“signed char”或“unsigned char”。对于我的,它在-12上签名并且在数学结果之上。 - Frank Osterfeld


你不应该。 使用 std::map 为了这个目的

例如

std::map<char,double> Weight;

Weight.insert(std::make_pair('A',500.98)); //include <algorithm>
Weight.insert(std::make_pair('P',455.49));

std::cout<< Weight['A']; //prints 500.98

你也可以迭代 map 运用 std::map<char,double>::iterator

例如

std::map<char,double>::iterator i = Weight.begin();
for(; i != Weight.end(); ++i)
  std::cout << "Weight[" << i->first << "] : " << i->second << std::endl;

/*prints 
    Weight['A'] : 500.98
    Weight['P'] : 455.49
*/

1
2017-08-14 13:46



字符是整数类型,因此是数组(或向量)的有效索引。通过从向量更改为映射,您将访问charastics从O(1)更改为O(log(n))而不是一个很好的权衡。 - Martin York
@Martin:我从来没说过它不是一个有效的索引。我只是说他/她不应该使用它,因为那确实会更令人困惑。用一个 std::map 更清洁。 you are changing the access charastics from O(1) to O(log(n)) not a good trade off。如果n是一个非常大的值,那将产生重大影响。对于一个小的价值 n 并看着更清晰的语法 std::map 我会推荐它。这完全不是一个很好的理由。当答案完全错误或误导时,你应该投票。 - Prasoon Saurav
@Prasoon Saurav:我认为答案错了。而且我不同意使用std :: map对我来说更清洁似乎使事情复杂化(并且复杂化一个简单的概念是一个糟糕的权衡)。但感谢有关投票方式和原因的教程。 - Martin York
@Prasoon Saurav:错了: google.com/... (如不正确)。你没有回答问题,然后继续提供一些完全不需要和未提供的东西。这是一种观点,从长远来看,我们只能看到社区认为一天会回来看看得分是多少。 - Martin York
我倾向于同意,如果意图是 地图 双打的角色,某种地图会更有意义。 (虽然我建议一个 unordered_map 相反,如果映射不完整但相当密集。) vector 有点意义,但更多的是性能优化,而不是一般的事情。 - cHao


如果你想要这个,你可以使用 std::map<char, double>。从技术上讲,也可以使用a std::vector<double>,但是从字符到整数会有各种各样的整数转换,程序会让人感到困惑。


0
2017-08-14 13:47