【问题标题】:Compile error declaring my char vector array编译错误声明我的 char 向量数组
【发布时间】:2014-04-19 16:47:11
【问题描述】:

我过去在网上用 c++ 进行了一些自学,但后来放弃了,直到我买了一本关于它的教科书并再次尝试。在我过去的研究中,我从来没有读过关于向量数组的任何东西(或者我可能读过但不记得了,谁知道呢)。

不管怎么说,它就像常规数组一样,可以为任何数据类型创建向量数组,我正在尝试创建一个 char 向量数组,但我遇到了一些编译错误,看看吧。

我想要一个包含 26 个字母的数组,其中包含字母表中的所有大写字母。所以我认为是 65 到 91。如果有更简单的方法来用我有兴趣学习的字母初始化数组。

#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector <char> vchChar(26, 65);

    for (int iii = 0; iii < vchChar.size(); iii++ )
    {
        for (int jjj = 65; jjj < 91; jjj++)
        {
            vchChar(iii) = jjj;
            cout << "vchChar(" << iii+1 << ") is:\t" << vchChar(iii) << endl;
        }
        //cout << "vchChar(" << iii+1 << ") is:\t" << vchChar(iii) << endl;
    }

    return 0;
}

最初我用方括号代替圆括号,修复了这个问题,并希望它可以工作,但是当我尝试在 cout 语句中更改它们时,出现了一整套新问题。当我将它们放在方括号中时,它会在终端中打印出来,没有编译错误。所以现在我有了类似的 cout 语句

cout << "vchChar(" << iii+1 << ") is:\t" << vchChar[iii] << endl;

我认为向量数组从它之前的元素递增一。但是当我将 vchChar 打印到所有'A'的终端时,我得到的只是。因此,我尝试使用另一个 for 循环来分配它们之前的元素中的一个。我得到了一些我想要的不同的输出,但找不到合适的算法来做。

我会坚持下去,但这篇文章的答案对我来说同样有益。我不知道我在做什么,所以发布你所拥有的一切,但请记住,我可能不知道你在说什么:S。我可能遗漏了一些东西,因为我在故障排除时稍微更改了代码,所以如果有任何问题,请提出,并感谢您的时间。

【问题讨论】:

    标签: c++ arrays for-loop vector


    【解决方案1】:

    我认为您的代码没有任何意义。如果我理解正确,您需要的是以下内容

    #include <iostream>
    #include <vector>
    #include <numeric>
    
    int main()
    {
        std::vector<char> vchChar(26);
    
        std::iota( vchChar.begin(), vchChar.end() , 'A' );
    
        for ( char c : vchChar ) std::cout << c << ' ';
        std::cout << std::endl;
    
        return 0;
    }
    

    或者你甚至可以这样写

    #include <iostream>
    #include <vector>
    #include <numeric>
    
    int main()
    {
        std::vector<char> vchChar( 'Z' - 'A' + 1 );
    
        std::iota( vchChar.begin(), vchChar.end() , 'A' );
    
        for ( char c : vchChar ) std::cout << c << ' ';
        std::cout << std::endl;
    
        return 0;
    }
    

    如果您的编译器不支持标准算法 std::iota 和基于范围的 for 语句,那么您可以编写

    #include <iostream>
    #include <vector>
    #include <numeric>
    
    int main()
    {
        std::vector<char> vchChar( 'Z' - 'A' + 1 );
    
        for ( char c = 'A'; c <= 'Z'; ++c ) vchChar[c - 'A'] = c;
    
        for ( std::vector<char>::size_type i = 0; i < vchChar.size(); ++i )
        {
            std::cout << "vchChar[" << i << "] is:\t" << vchChar[i] << std::endl;
        }
    
        return 0;
    }
    

    考虑到将幻数用作 65 或 91 是一个坏主意。例如,如果程序将在 IBM 大型机中运行,那么结果将出乎意料,因为存在另一个编码系统,即 EBCDIC 而不是ASCII。

    至于陈述

    vchChar(iii) = jjj;
    

    那么它是无效的。表达式vchChar(iii) 表示使用一个未在类std::vector 中定义的参数调用运算符函数。

    【讨论】:

    • 请在您的帖子中提及 iota 来自 C++11 及更高版本。
    • @Laszlo Papp 我为什么要提这个?!据我所知,现在是 2014 年。
    • 你真的认为每个人都在使用 2014 年的技术吗?无论哪种方式,请随意忽略我的建议。
    • @Laszlo Papp。谢谢。我会考虑您的建议。
    • 好的,希望不是您在没有任何解释的情况下投反对票作为报复。人们在没有解释的情况下抱怨投反对票,这太糟糕了,但他们开始报复却没有任何解释,尤其是他们所抱怨的。 :)
    【解决方案2】:

    您的代码中至少存在以下问题:

    • 设置向量元素不是通过myVector(index),而是通过myVector[index],所以基本上是operator[]。但是,在这种特殊情况下,您可以只使用push them in a row to the back

    • 您正尝试使用vchChar(iii) 打印数组的一个元素,但您应该使用.at(index) 方法。

    • 这并不重要,但在这种特殊情况下,您可以使用迭代器模式来遍历向量而不是处理索引。即使您不这样做,也无需使用iiijjj 代替常规的ij 作为变量名。

    • 当您将其中一个计数器与向量大小进行比较时,我更喜欢使用 size_tvector&lt;char&gt;::size_type 作为循环计数器。

    • 您不止一次设置元素,因为您有一个嵌套循环。

    • 您不必要地以不同于默认值的方式构造向量。

    • 您使用的是硬编码整数而不是实际字符。

    因此,您的正确代码如下所示:

    #include <vector>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        vector <char> vchChar;
        for (char c = 'A'; c <= 'Z'; ++c)
            vchChar.push_back(c);
    
        for (vector<char>::size_t i = 0; i < vchChar.size(); ++i)
            cout << "vchChar(" << i+1 << ") is:\t" << vchChar.at(i) << endl;
    
        return 0;
    }
    

    免责声明:这只是编译和运行时修复。我没有处理用例和设计问题。正如我部分提到的,有更好的解决方案,但我决定让您的代码影响最小。

    【讨论】:

      【解决方案3】:

      您不需要嵌套循环。

      {
          vector<char> vchChar;
      
          for (char letter = 'A'; letter <= 'Z'; ++letter) {
              vchChar.push_back(letter);
          }
      
          for (int i = 0; i < (int) vchChar.size(); ++i) {
              cout << vchChar[i]; 
          }
      }
      

      【讨论】:

      • operator[] 听起来不适合阅读。对于 int 与 size() 的比较,您还将收到警告(希望如此)。向量中也没有“添加”方法。您不会在主函数中返回整数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多