vector <vector <int>&gt; </vector <int>上的push_back问题

时间:2011-03-14 21:51:01

标签: c++

亲爱的所有人,
我使用矢量向量,说vector<vector<int> > no_1_2来存储两个vector<int>容器的元素,比如no1&amp; NO2。所以例如我会说,no1 = {2,5,7,10,3}和no2 = {21,34,15}。

我想将这两个向量存储在一个名为no_1_2的容器中,我在两个'for'循环中使用了no_1_2[0].push_back(no1.at(i))no_1_2[1].push_back(no2.at(j))。但是,我得到了错误。无论如何要解决这个问题?

我不能push_back向量的向量?任何帮助请.. 感谢

抱歉,这是我的代码的一部分, //这里有一些类和一些代码

vector< vector<int> > final_list(int code1,int code2){
   vector<vector<int> > no_1_2;
   vector<int> in;
   vector<int> out;
   for (int foo=0;foo<size();foo++){
       int a_point=foo;
       if (at(a_point).Code()==code1){
           vector<int> closer_points;
           closer_points=at(foo).Closers();
           for (int fee=0;fee<closer_points.size();fee++){
               int a_neb_point=closer_points.at(fee);
               if (at(a_neb_point).Code()==code2){
                    in.push_back(a_point);  
                    out.push_back(a_neb_point);  
                    }
               }
           }
       }
   /remove duplicates // above in and out vectors containing some values repeatedly, so, i remove the duplicates here
   for(vector<int>::iterator i=in.begin();i!=in.end();i++){
     sort(in.begin(),in.end());
     in.erase(unique(in.begin(),in.end()),in.end()); 
     no_1_2[0].push_back(*i);
     }
   for(vector<int>::iterator o=out.begin();o!=out.end();o++){
     sort(out.begin(),out.end());
     out.erase(unique(out.begin(),out.end()),out.end());
     no_1_2[1].push_back(*o);
     }
   return no_1_2;
   }

int main (){
// some code

vector< vector <int> > in_out=mylist.final_list(34,1); //here i just tried for code    values for (34, 1), like that i have many sets
}

3 个答案:

答案 0 :(得分:4)

在没有看到您的实际代码和错误的情况下,让我猜一下:

在您访问no_1_2.resize(2)no_1_2[0]

之前,您没有致电no_1_2[1]

编辑:看到代码后,上面不再猜测:

您无法no_1_2[0].push_back(*i); - no_1_2为空,而您正在尝试访问no_1_2[0]。您需要在循环之前调整它的大小。

EDIT2:

将您的排序/唯一/擦除移到循环之外,并使用assign或operator =:

sort(in.begin(),in.end());
in.erase(unique(in.begin(),in.end()),in.end()); 
no_1_2[0].assign(in.begin(), in.end());
// OR: no_1_2[0] = in;

答案 1 :(得分:1)

std::vector::at引用返回到向量中位置n的元素。

std::vector<int> vec(2);
vec[0] = 0;
vec[1] = 1;

cout << vec.at(0) ;  // returns 0 but not the vector.

因此,为了返回一个向量,该位置的值必须是一个向量,而在你提到的向量no1no2中则不是这种情况。

std::vector< std::vector<int> > no_1_2;
std::vector<int> no1(5), no2(3) ;
// Assigning values to vector of integers no1, no2

no_1_2.push_back(no1);
no_1_2.push_back(no2);

no_1_2.at(0) ; // This returns std::vector<int>

no_1_2[0].push_back(*i);no_1_2[1].push_back(*o);是错误。您需要调整矢量大小,因为在 no_1_2,in,out 声明时,未提及容器的大小。

vector<vector<int>> no_1_2 ;
vector<int> in;
vector<int> out;

由于未提及 no_1_2 size,因此在其上使用[]会出错。但是,一旦在 push_back 之后,它就有效了。示例 -

vector<int> temp;
temp[0] = 10;    // Error : What is temp[0] ? size of temp is 0 and where would the `[0]` take to.
temp.push_back(10);  // Increased the size of vector
temp[0] = 30 ;       // And this is now valid.

答案 2 :(得分:0)

我假设您没有正确分配矢量矢量。

vector< vector<int> > vectors; 
  vectors.resize(2); 

FWIW,你没有对向量的向量进行push_back,你正在从向量no2到向量no_1_2 [1]进行int的push_back。