C++ 通过参考时,松开2D向量的内容

C++ 通过参考时,松开2D向量的内容,c++,c++11,vector,reference,2d-vector,C++,C++11,Vector,Reference,2d Vector,我正在解决一个问题,但我遇到了一个奇怪的错误。 在eval函数中,我接收分数作为2d向量的参考。 对于最初的多次求值调用,将保留分数的内容。但是,在某些点上,分数中的子向量(向量)的内容丢失-子向量的大小()为0。 然而,当我将代码更改为以副本形式接收分数(向量的新实例)时,我没有遇到问题,但很明显,代码将非常慢。像这样: ... int eval(vector<int>&team, vector<vector<int>> scores){ ... v

我正在解决一个问题,但我遇到了一个奇怪的错误。 在eval函数中,我接收分数作为2d向量的参考。 对于最初的多次求值调用,将保留分数的内容。但是,在某些点上,分数中的子向量(
向量
)的内容丢失-子向量的大小()为0。 然而,当我将代码更改为以副本形式接收分数(向量的新实例)时,我没有遇到问题,但很明显,代码将非常慢。像这样:

...
int eval(vector<int>&team, vector<vector<int>> scores){
...
void rec(int idx, int d, vector<int>& team, vector<vector<int>> scores){
...
这是所有的代码。我希望您可以帮助med解决此问题,并为som提供有关可能发生此错误的原因的见解。这也是我关于stackoverflow的第一篇文章(请告诉我是否可以以任何方式改进该文章:)

编辑:我最初将分数作为一个全局变量(没有将其作为引用传递),但这会产生完全相同的错误

#include<bits/stdc++.h>
using namespace std;
int N, K, C;
vector<int> teams;
int eval(vector<int>&team, vector<vector<int>>& scores){
  int s = 0;
  for(int i = 0; i < K; i++){
    int m = 0;
    for(int j = 0; j < K; j++){
      cout << team[j] << scores[team[j]].size() << " " << i << endl;
      m = max(scores[team[j]][i], m);
    }
    s += m;
  }
  return s;
}
void rec(int idx, int d, vector<int>& team, vector<vector<int>>& scores){
  if(d == K){
    teams.push_back(eval(team, scores));
  }
  for(int i = idx; i < N; i++){
    team[d] = i;
    rec(i+1, d+1, team, scores);
  }
}
int main(){
  cin >> N >> K >> C;
  vector<vector<int>> scores = vector<vector<int>> (N, vector<int> (K, 0));
  for(int i = 0; i < N; i++){
    for(int j = 0; j < K; j++){
      cin >> scores[i][j];
    }
  }
  //for(int i = 0; i < N; i++) cout << i << " "<< scores[i].size() << endl;
  vector<int> team (K);
  rec(0, 0, team, scores);
  sort(teams.rbegin(), teams.rend());
  cout << teams[C-1] << endl;
}
#包括
使用名称空间std;
int N,K,C;
病媒小组;
内部评估(向量和团队、向量和分数){
int s=0;
for(int i=0;iC;
向量得分=向量(N,向量(K,0));
对于(int i=0;i>得分[i][j];
}
}

//对于(int i=0;i分数中读取数据,并且传递值很慢,那么您应该使用constreference@Slava.我尝试过:
const vector&scores
,但它并没有解决问题。它可能不会,但会使代码更干净,并有助于消除对向量的可能修改,前提是它不应该被修改d、 在您的情况下,您很可能会访问超出边界的数据。要检查这一点,请使用验证边界的方法
std::vector::at()
替换通过
operator[]
进行的访问。另一个可能的原因是数据损坏,但如果使用
at()访问超出边界的数据,则会再次发生这种情况
应该有帮助。@Slava这确实是一个越界错误:)但是发生越界错误是因为2d向量中存储的所有数据突然不存在-子数组的大小从6变为0,即使我在任何时候都没有修改内容。数据不会突然消失。这可能是因为您修改了另一个向量ctor超出范围。请再次验证您的访问权限。
#include<bits/stdc++.h>
using namespace std;
int N, K, C;
vector<int> teams;
int eval(vector<int>&team, vector<vector<int>>& scores){
  int s = 0;
  for(int i = 0; i < K; i++){
    int m = 0;
    for(int j = 0; j < K; j++){
      cout << team[j] << scores[team[j]].size() << " " << i << endl;
      m = max(scores[team[j]][i], m);
    }
    s += m;
  }
  return s;
}
void rec(int idx, int d, vector<int>& team, vector<vector<int>>& scores){
  if(d == K){
    teams.push_back(eval(team, scores));
  }
  for(int i = idx; i < N; i++){
    team[d] = i;
    rec(i+1, d+1, team, scores);
  }
}
int main(){
  cin >> N >> K >> C;
  vector<vector<int>> scores = vector<vector<int>> (N, vector<int> (K, 0));
  for(int i = 0; i < N; i++){
    for(int j = 0; j < K; j++){
      cin >> scores[i][j];
    }
  }
  //for(int i = 0; i < N; i++) cout << i << " "<< scores[i].size() << endl;
  vector<int> team (K);
  rec(0, 0, team, scores);
  sort(teams.rbegin(), teams.rend());
  cout << teams[C-1] << endl;
}