我过去曾用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。我可能遗漏了一些东西,因为我在排除故障时稍微更改了代码,所以如果有任何问题请教,感谢您的时间。
答案 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)方法。
这并不重要,但在这种特殊情况下,您可以使用迭代器模式来遍历向量而不是处理索引。即使您不这样做,也不必将iii
和jjj
用于变量名称,而不是常规i
和j
。
我希望将size_t
或vector<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];
}
}