C++;代码错误-无操作员“<<&引用;匹配这些操作数 VisualStudio 2017中的下面C++代码没有编译,而是抛出这个异常: #include<iostream> #include<vector> using namespace std; void main() { vector<int> a[5]; for (int i = 0; i < 5; i++) cin >> a[i]; for (int i = 0; i < 5; i++) cout << a[i] << " "; cout << "\nHello world"; } #包括 #包括 使用名称空间std; void main() { 向量a[5]; 对于(int i=0;i>a[i]; 对于(int i=0;i

C++;代码错误-无操作员“<<&引用;匹配这些操作数 VisualStudio 2017中的下面C++代码没有编译,而是抛出这个异常: #include<iostream> #include<vector> using namespace std; void main() { vector<int> a[5]; for (int i = 0; i < 5; i++) cin >> a[i]; for (int i = 0; i < 5; i++) cout << a[i] << " "; cout << "\nHello world"; } #包括 #包括 使用名称空间std; void main() { 向量a[5]; 对于(int i=0;i>a[i]; 对于(int i=0;i,c++,C++,我想知道是什么问题。任何建议都会有很大帮助。谢谢。向量a[5];定义了一个由5个向量组成的数组;因此,a[I]是一个完整的向量。使用圆括号,将5作为向量构造函数的size参数:将向量定义为向量a(5); 当然,拥有一个恒定的大小很容易出错,也很难维护。向量的存在正是为了防止这种不灵活。向量的典型使用方式是动态地建立它们。它们在内部跟踪它们的大小。添加一个元素并不像映射那样容易:简单地说a[27]=3;不会创建元素28(以及元素之间的元素)。当然可以,但接口不是这样设计的。相反,我们可以通过复制来

我想知道是什么问题。任何建议都会有很大帮助。谢谢。

向量a[5];
定义了一个由5个向量组成的数组;因此,
a[I]
是一个完整的向量。使用圆括号,将5作为向量构造函数的size参数:将向量定义为
向量a(5);

当然,拥有一个恒定的大小很容易出错,也很难维护。向量的存在正是为了防止这种不灵活。向量的典型使用方式是动态地建立它们。它们在内部跟踪它们的大小。添加一个元素并不像映射那样容易:简单地说
a[27]=3;
不会创建元素28(以及元素之间的元素)。当然可以,但接口不是这样设计的。相反,我们可以通过复制来附加元素,或者通过在原位构造元素来附加元素(保存副本)。使用
push_back
,可以创建有效的版本

vector<int> a;
while(cin)
{ 
   int newVal;
   cin >> newVal;
   if(cin) { a.push_back(newVal); } // add to vector if input was good
}

这是好还是坏?一个代码审查的问题。经验告诉我,尽可能地保持代码的简单和简单,而不需要太多的冗余。但是对于现代C++,我认为,抽象的解决方案是非常习惯的:远离具体类型和特定的数据来处理通用性和算法。

当然,现在的输出也是老派的。我们可以写

  std::copy (   vec.begin(),
                vec.end(),
                ostream_iterator<int>(cout, " ")
            );
std::copy(vec.begin(),
vec.end(),
ostream_迭代器(cout,“”)
);

ostream_迭代器的第二个参数是在每个输出(包括最后一个输出)后追加的字符串;这是一个常见但愚蠢的问题,也是一个抽象通常意味着在细节级别妥协的一般示例(例如,如果您曾经想知道为什么某些属性对话框(例如VS中的属性对话框)如此糟糕:我打赌它们是生成的,而不是手动编程的).为了掩饰这一点,我省略了数字之间的逗号;一个简单的空格就可以了,尾随的空格是不可见的,而不是尾随的逗号。但我认为这里的比例是老派的。

我想你只是忘了把#包括在内!@Peter Monica,你能检查一下编辑过的版本吗?你可能不支持ed在那里使用向量数组,但只需
向量a(5);
就可以得到一个包含五个预分配元素的向量。@Peter在他们的评论中完全走错了方向。@πάνταῥεῖ 嗯,OP没有在他们的第一个版本中包含iostream…@Peter,我从来没有看到过那个版本,在你的评论后,OP对它进行了更正。
#include <iostream>     // std::cout
#include <iterator>     // std::back_inserter
#include <vector>       // std::vector
#include <algorithm>    // std::copy

using namespace std; // less clutter

int main ()
{
  vector<int> vec; // size is 0, cannot access any vec[i].

  // The input routine, a bit abstract.
  std::copy (   istream_iterator<int>(cin), // source start
                istream_iterator<int>(),    // source end
                back_inserter(vec)          // destination
            );

  cout << "vec contains: ";
  for ( auto it = vec.begin(); it!= vec.end(); ++it )
  {
      cout << ' ' << *it;
  }
  cout << '\n';

  return 0;
}
  std::copy (   vec.begin(),
                vec.end(),
                ostream_iterator<int>(cout, " ")
            );