C+中的函数顺序+; 我是C++新手。我的程序中有三个函数。 第一个与python中的np.linspace的工作原理相同。后两个函数都接受一个2d向量,一个整数并返回一个2d向量。 这是我的密码: #include <iostream> #include <cmath> #include <vector> using namespace std; vector<float> linspace(float start, float end, int step); vector< vector<float> > angleDisc(vector < vector<float> > data, int theta_loc); vector< vector<float> > ringDisc(vector < vector<float> > data, int r_loc); const float R_M = 18, RESO_R = 80; const float RESO_THETA = 60; const float PI = 3.14159; const vector<float> DIS_R = linspace(0, R_M, RESO_R); const vector<float> DIS_THETA = linspace(0, PI/2, RESO_THETA); int main() { vector < vector<float> > inner = {{0.1, 0.000001},{1,-2},{-2,3},{1,3},{6,1},{4,-4},{1,3.2},{4,5.7}}; vector< vector<float> > angled = angleDisc(inner, 0); //vector< vector<float> > ringd = ringDisc(inner, 0); for(int j = 0; j < angled.size(); j++){ for(int i = 0; i < 2; i++){ cout << angled[j][i] << " "; } cout << "next" << endl; return 0; } vector<float> linspace(float start, float end, int step){ vector<float> stairs; float increment = (end - start) / step; for (int i = 0; i <= step; i++){ stairs.push_back(i * increment); } return stairs; } vector< vector<float> > angleDisc(vector < vector<float> > data, int theta_loc){ vector< vector < vector<float> > > pieced_disc( DIS_THETA.size() ); float angle; for (int i = 0; i <= DIS_THETA.size() - 1; i++){ for (int k = 0; k <= data.size() - 1; k++){ angle = abs( atan( data[k][1] / data[k][0])); if ( (angle > DIS_THETA[i]) && (angle <= DIS_THETA[i+1]) ){ pieced_disc[i].push_back(data[k]); data.erase(data.begin() + k - 1 ); } } } return pieced_disc[theta_loc]; } vector< vector<float> > ringDisc(vector < vector<float> > data, int r_loc){ vector< vector < vector<float> > > ringed_disc( DIS_R.size() ); float r; for (int i = 0; i <= DIS_R.size() - 1; i++){ for (int k = 0; k <= data.size() - 1; k++){ r = sqrt(pow(data[k][0], 2) + pow(data[k][1], 2)); if ( (r > DIS_R[i]) && (r < DIS_R[i+1]) ){ ringed_disc[i].push_back(data[k]); data.erase(data.begin() + k - 1 ); } } } return ringed_disc[r_loc]; } #包括 #包括 #包括 使用名称空间std; 向量linspace(浮点开始、浮点结束、整数步长); 向量angleDisc(向量数据,int theta_loc); 向量环盘(向量数据,int r_loc); 常数浮点数R_M=18,分辨率R=80; 常数浮点分辨率=60; 常数浮点PI=3.14159; 常数向量DIS_R=linspace(0,R_M,RESO_R); 常数向量DIS_θ=linspace(0,PI/2,分辨率); int main(){ 向量内部={0.1,0.000001},{1,-2},{2,3},{1,3},{6,1},{4,-4},{1,3.2},{4,5.7}; 向量角度=角度圆盘(内部,0); //向量ringd=ringDisc(内部,0); 对于(int j=0;j

C+中的函数顺序+; 我是C++新手。我的程序中有三个函数。 第一个与python中的np.linspace的工作原理相同。后两个函数都接受一个2d向量,一个整数并返回一个2d向量。 这是我的密码: #include <iostream> #include <cmath> #include <vector> using namespace std; vector<float> linspace(float start, float end, int step); vector< vector<float> > angleDisc(vector < vector<float> > data, int theta_loc); vector< vector<float> > ringDisc(vector < vector<float> > data, int r_loc); const float R_M = 18, RESO_R = 80; const float RESO_THETA = 60; const float PI = 3.14159; const vector<float> DIS_R = linspace(0, R_M, RESO_R); const vector<float> DIS_THETA = linspace(0, PI/2, RESO_THETA); int main() { vector < vector<float> > inner = {{0.1, 0.000001},{1,-2},{-2,3},{1,3},{6,1},{4,-4},{1,3.2},{4,5.7}}; vector< vector<float> > angled = angleDisc(inner, 0); //vector< vector<float> > ringd = ringDisc(inner, 0); for(int j = 0; j < angled.size(); j++){ for(int i = 0; i < 2; i++){ cout << angled[j][i] << " "; } cout << "next" << endl; return 0; } vector<float> linspace(float start, float end, int step){ vector<float> stairs; float increment = (end - start) / step; for (int i = 0; i <= step; i++){ stairs.push_back(i * increment); } return stairs; } vector< vector<float> > angleDisc(vector < vector<float> > data, int theta_loc){ vector< vector < vector<float> > > pieced_disc( DIS_THETA.size() ); float angle; for (int i = 0; i <= DIS_THETA.size() - 1; i++){ for (int k = 0; k <= data.size() - 1; k++){ angle = abs( atan( data[k][1] / data[k][0])); if ( (angle > DIS_THETA[i]) && (angle <= DIS_THETA[i+1]) ){ pieced_disc[i].push_back(data[k]); data.erase(data.begin() + k - 1 ); } } } return pieced_disc[theta_loc]; } vector< vector<float> > ringDisc(vector < vector<float> > data, int r_loc){ vector< vector < vector<float> > > ringed_disc( DIS_R.size() ); float r; for (int i = 0; i <= DIS_R.size() - 1; i++){ for (int k = 0; k <= data.size() - 1; k++){ r = sqrt(pow(data[k][0], 2) + pow(data[k][1], 2)); if ( (r > DIS_R[i]) && (r < DIS_R[i+1]) ){ ringed_disc[i].push_back(data[k]); data.erase(data.begin() + k - 1 ); } } } return ringed_disc[r_loc]; } #包括 #包括 #包括 使用名称空间std; 向量linspace(浮点开始、浮点结束、整数步长); 向量angleDisc(向量数据,int theta_loc); 向量环盘(向量数据,int r_loc); 常数浮点数R_M=18,分辨率R=80; 常数浮点分辨率=60; 常数浮点PI=3.14159; 常数向量DIS_R=linspace(0,R_M,RESO_R); 常数向量DIS_θ=linspace(0,PI/2,分辨率); int main(){ 向量内部={0.1,0.000001},{1,-2},{2,3},{1,3},{6,1},{4,-4},{1,3.2},{4,5.7}; 向量角度=角度圆盘(内部,0); //向量ringd=ringDisc(内部,0); 对于(int j=0;j,c++,function,c++11,vector,C++,Function,C++11,Vector,在主函数中。代码仍然可以成功编译,但执行对象文件不会返回任何内容,我必须按“Control+C”退出 我试过: 1) 翻转函数angleDisc()和ringDisc()的顺序,在本例中,首先执行的ringDisc()可以在主函数中打印结果,但angleDisc不能 2) 让ringDisc()与angleDisc完全相同,但只是函数名不同,这一次,两个函数都可以正常工作 我真的很困惑,有人能帮我吗?您正在修改函数中的向量数据,但您已经将其作为传递值传递给了函数。相反,您应该将其作为传递引用传递

在主函数中。代码仍然可以成功编译,但执行对象文件不会返回任何内容,我必须按“Control+C”退出

我试过: 1) 翻转函数angleDisc()和ringDisc()的顺序,在本例中,首先执行的ringDisc()可以在主函数中打印结果,但angleDisc不能

2) 让ringDisc()与angleDisc完全相同,但只是函数名不同,这一次,两个函数都可以正常工作


我真的很困惑,有人能帮我吗?

您正在修改函数中的向量数据,但您已经将其作为传递值传递给了函数。相反,您应该将其作为传递引用传递给函数

。 我想这是正确的

#include <iostream>
#include <cmath>
#include <vector>
using namespace std;

vector<float> linspace(float start, float end, int step);
vector< vector<float> > angleDisc(vector < vector<float> > &data, int theta_loc);
vector< vector<float> > ringDisc(vector < vector<float> > &data, int r_loc);

const float R_M = 18, RESO_R = 80;
const float RESO_THETA = 60;
const float PI = 3.14159;

const vector<float> DIS_R = linspace(0, R_M, RESO_R);
const vector<float> DIS_THETA = linspace(0, PI/2, RESO_THETA);

vector<float> linspace(float start, float end, int step){
    vector<float> stairs;
    float increment = (end - start) / step;
    for (int i = 0; i <= step; i++){
        stairs.push_back(i * increment);
    }
    return stairs;
}

vector< vector<float> > angleDisc(vector < vector<float> > &data, int theta_loc){
   vector< vector < vector<float> > > pieced_disc( DIS_THETA.size() );
   float angle;

   for (int i = 0; i < DIS_THETA.size(); i++){
       for (int k = 0; k < data.size(); k++){
           angle = abs(atan( data[k][1] / data[k][0]));
           cout<<"angle: "<<angle<<"\n";
           if ( (angle > DIS_THETA[i]) && (angle <= DIS_THETA[i+1]) ){
               pieced_disc[i].push_back(data[k]);
               data.erase(data.begin() + k);
           } 
       }
   }
   return pieced_disc[theta_loc];
}


vector< vector<float> > ringDisc(vector < vector<float> > &data, int r_loc){
   vector< vector < vector<float> > > ringed_disc( DIS_R.size() );
   float r;

   for (int i = 0; i < DIS_R.size(); i++){
       for (int k = 0; k < data.size(); k++){
           r = sqrt(pow(data[k][0], 2) + pow(data[k][1], 2));
           if ( (r > DIS_R[i]) && (r < DIS_R[i+1]) ){
               ringed_disc[i].push_back(data[k]);
               data.erase(data.begin() + k);
           }
       }
   }
   return ringed_disc[r_loc];
}


int main() {
    vector < vector<float> > inner = {{0.1, 0.000001},{1,-2},{-2,3},{1,3},{6,1},{4,-4},{1,3.2},{4,5.7}};
    vector< vector<float> > angled = angleDisc(inner, 0);
    vector< vector<float> > ringd = ringDisc(inner, 0);

    for(int j = 0; j < angled.size(); j++){
        for(int i = 0; i < 2; i++){
        cout << angled[j][i] << " ";
        }
        cout << "next" << endl;
        return 0;
    }

    for(int j = 0; j < ringd.size(); j++){
        for(int i = 0; i < 2; i++){
        cout << ringd[j][i] << " ";
        }
        cout << "next" << endl;
        return 0;
    }
}
#包括
#包括
#包括
使用名称空间std;
向量linspace(浮点开始、浮点结束、整数步长);
向量角度盘(向量数据,int theta\u loc);
vectorringDisc(vector和数据,int r_loc);
常数浮点数R_M=18,分辨率R=80;
常数浮点分辨率=60;
常数浮点PI=3.14159;
常数向量DIS_R=linspace(0,R_M,RESO_R);
常数向量DIS_θ=linspace(0,PI/2,分辨率);
向量linspace(浮点开始、浮点结束、整数步长){
向量楼梯;
浮动增量=(结束-开始)/步长;
对于(int i=0;i角度盘(向量&数据,intθ位置){
vector>分片光盘(DIS_THETA.size());
浮动角;
对于(int i=0;i角度=角度圆盘(内部,0);
向量ringd=ringDisc(内部,0);
对于(int j=0;jk==0
)您尝试

data.erase(data.begin() - 1);
i==DIS\R.size()-1
时,再次尝试

DIS_R[i+1]

为什么在迭代过程中要从
数据中删除元素呢?这只会导致访问一半的元素

您是否尝试用调试器调试代码?旁白:
i旁白:与其说是两个元素
向量
,不如说
结构点{float x;float y;float angle()const;float distance()const;}
?你想在这里做什么?我想你是想找到某个角度或大小范围内的所有点。例如,也许他们希望对
数据的副本进行操作。嗯,这可能是原因之一。你能更详细地解释一下吗?你所说的未定义的行为是什么意思?未定义的行为意味着编译器允许用任何东西代替你的程序我删除了
擦除了
,然后代码就开始工作了。我想删除的原因是我想在知道这些点在哪个单元格中后去掉它们。
DIS_R[i+1]