编译错误声明我的char矢量数组

时间:2014-04-19 16:47:12

标签: c++ arrays for-loop vector

我过去曾用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;

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

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

3 个答案:

答案 0 :(得分:3)

我的代码中没有任何意义。如果我已正确理解您需要的是以下

#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中定义的参数调用运算符函数。

答案 1 :(得分:2)

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

  • 设置vector元素不是由myVector(index)完成的,而是myVector [index],所以基本上是operator[]。但是,在这种特殊情况下,您可以push them in a row to the back

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

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

  • 我希望将size_tvector<char>::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;
}

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

答案 2 :(得分:1)

您不需要嵌套循环。

{
    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]; 
    }
}