Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用其他类的向量作为反向迭代器_C++_C++11_Stdvector_Reverse Iterator - Fatal编程技术网

C++ 使用其他类的向量作为反向迭代器

C++ 使用其他类的向量作为反向迭代器,c++,c++11,stdvector,reverse-iterator,C++,C++11,Stdvector,Reverse Iterator,对不起,我现在手头紧。我以前没有使用过反向迭代器,正如您在我的代码中看到的,我还希望使用另一个类的向量作为迭代器对象: double indicators::sRSItemp(input* Close1, int StartDay) { int n = 14; double rs; double rsi; double tmpavl; double tmpavg; if (!RSI.empty()) { for ( vector<double>::revers

对不起,我现在手头紧。我以前没有使用过反向迭代器,正如您在我的代码中看到的,我还希望使用另一个类的向量作为迭代器对象:

double indicators::sRSItemp(input* Close1, int StartDay) {
  int n = 14;
  double rs;
  double rsi;
  double tmpavl;
  double tmpavg;


if (!RSI.empty()) {
for ( vector<double>::reverse_iterator i = Close1->Close.rbegin(); i != Close1->Close.rend(); ++i ) {

    if (Close1->Close[i] < Close1->Close[(i + 1)]){
        tmpavl = ((AVL[0] * 13 ) + (Close1->Close[(i +1)] - Close1->Close[i] ) / n);
        cout << "AVLtmp " << AVL[0] << endl; 
        cout << "tmpavl " << tmpavl << endl;
        AVL.insert(AVL.begin(), tmpavl);
        cout << "AVL is " << AVL[0] << endl;

        tmpavg = ((AVG[0] * 13 ) / n );
        AVG.insert(AVG.begin(), tmpavg);
        // cout << "AVG is " << AVG[i] << endl;
        }

        else if  (Close1->Close[i] > Close1->Close[(i + 1)]) { 
            tmpavg = ((AVG[0] * 13 ) + (Close1->Close[i] - Close1->Close[(i +1)]) / n );
            AVG.insert(AVG.begin(), tmpavg);
            // cout << "AVG is " << AVG[i] << endl;

            tmpavl = ((AVL[0] * 13 ) / n );
            AVL.insert(AVL.begin(), tmpavl); 
            // cout << "AVL is " << AVL[i] << endl;

            }

            rs = AVG[0] / AVL[0];
            rsi = (100.0 - (100.0 / (1.0 + rs)));
            RSI.insert(RSI.begin(), rsi);

            }
    }
return 0;
}
双指示器::sRSItemp(输入*Close1,int StartDay){
int n=14;
双rs;
双rsi;
双tmpavl;
双tmpavg;
如果(!RSI.empty()){
对于(vector::reverse_迭代器i=Close1->Close.rbegin();i!=Close1->Close.rend();++i){
if(Close1->Close[i]Close[(i+1)]){
tmpavl=((AVL[0]*13)+(Close1->Close[(i+1)]-Close1->Close[i])/n);

coutstd::vector的方括号操作符接受索引,而不是迭代器

这里您尝试使用迭代器作为索引:

if (Close1->Close[i] < Close1->Close[(i + 1)]) {
if(Close1->Close[i]Close[(i+1)]){
不应将迭代器传递给运算符[],而应使用星号取消对它们的引用,以便获得它们所指向的向量元素:

if (*i < *(i + 1)) {
if(*i<*(i+1)){


另外,要小心取消引用
i+1
:在循环的最后一次迭代中,
i+1
将等于
rend()
(与最后一个元素迭代器相反)。试图通过这样的迭代器访问任何内容将导致未定义的行为。

std::vector的方括号运算符接受索引,而不是迭代器

这里您尝试使用迭代器作为索引:

if (Close1->Close[i] < Close1->Close[(i + 1)]) {
if(Close1->Close[i]Close[(i+1)]){
不应将迭代器传递给运算符[],而应使用星号取消对它们的引用,以便获得它们所指向的向量元素:

if (*i < *(i + 1)) {
if(*i<*(i+1)){


另外,要小心取消引用
i+1
:在循环的最后一次迭代中,
i+1
将等于
rend()
(与最后一个元素迭代器相反)。试图通过这样的迭代器访问任何内容都将导致未定义的行为。

要查看您做错了什么,请注意这两者是等效的

int main(){
    vector<int> myVec {{1,2,3,4}};
    //read then print each value in vector
    for(vector<int>::iterator i=myVec.begin();i!=myVec.end(); ++i){
    //here i is an iterator not an index
         int val = *i; //get value in current position within vector
         cout<<val<<endl;
    }

    for(int i=0; i!=myVec.size(); ++i){
    // here i is an index
         int val = myVec[i];//get value in current position within vector
         cout<<val<<endl;
    }

 }
intmain(){
向量myVec{{1,2,3,4};
//读取并打印矢量中的每个值
对于(向量::迭代器i=myVec.begin();i!=myVec.end();++i){
//这里我是一个迭代器,不是索引
int val=*i;//获取向量中当前位置的值

要想知道你做错了什么,请注意这两者是等价的

int main(){
    vector<int> myVec {{1,2,3,4}};
    //read then print each value in vector
    for(vector<int>::iterator i=myVec.begin();i!=myVec.end(); ++i){
    //here i is an iterator not an index
         int val = *i; //get value in current position within vector
         cout<<val<<endl;
    }

    for(int i=0; i!=myVec.size(); ++i){
    // here i is an index
         int val = myVec[i];//get value in current position within vector
         cout<<val<<endl;
    }

 }
intmain(){
向量myVec{{1,2,3,4};
//读取并打印矢量中的每个值
对于(向量::迭代器i=myVec.begin();i!=myVec.end();++i){
//这里我是一个迭代器,不是索引
int val=*i;//获取向量中当前位置的值

什么类型是
input
?您能发布我们可以用来重现错误的最小数量的代码吗?您可以用与迭代器相同的方法取消对反向迭代器的引用。因此,如果(*i<*(i+1)),您的比较应该是
。什么类型的
输入
?您能发布我们可以用来重现错误的最小数量的代码吗?您可以用与迭代器相同的方法取消对反向迭代器的引用。因此,您的比较应该是
if(*i<*(i+1))
。非常感谢!成功了!这只是关于取消引用最后一个元素的后续问题。是否有方法可以在该元素之前停止迭代?@PushT是的,您应该能够在for:
I!=Close1->Close.rend()的条件中添加-1-1
。非常感谢!这很有效!只是一个关于取消引用最后一个元素的后续问题。有没有方法可以在该元素之前停止迭代?@PushT是的,您应该能够在条件中添加-1:
I!=Close1->Close.rend()-1