向量迭代器不可忽略C++

问题描述:

我想通过使用(max_element-min_element)从一个向量来设置一个浮点值。我正在循环其中几个,因此矢量和矢量的矢量。向量迭代器不可忽略C++

,我发现了以下错误:

Expression: Vector iterator not dereferencable

vector<float> amplitudeStorage; 
vector<vector<float>> vectorStorage;  


int main(){ 

     for (int i = 0; i < amplitudeStorage.size(); i++) 
     { 
     AssignWaveAmplitude(amplitudeStorage[i], vectorStorage[i]); 
     } 
    } 

它发生在函数调用。功能看起来像这样:

void AssignWaveAmplitude(float amplitudeVariable, vector<float> dataVectorr) 
{ 
    amplitudeVariable = (*max_element(begin(dataVectorr), end(dataVectorr))) - (*min_element(begin(dataVectorr), end(dataVectorr))); 
} 

有谁知道如何解决这个问题?

非常感谢。

编辑1:解决这个问题是对这个问题的第一个评论。我使用的一些向量是空的,导致了错误。

EDIT2:

@WhozCraig所以现在我已经做到了这一点:

for (int i = 0; i < amplitudeStorage.size(); i++) { 
    amplitudeStorage[i] =AssignWaveAmplitude(vectorStorage[i]);         
    } 

这:

float AssignWaveAmplitude(vector<float> dataVectorr) { 

    return (*max_element(begin(dataVectorr), end(dataVectorr))) - (*min_element(begin(dataVectorr), end(dataVectorr))); 
} 

但花车都还站出来为同一个号码。任何想法为什么?

编辑3:原来,为什么浮动错误是因为我错误地输出它们。

我做: cout << lowerBackYAmplitude<< endl (这是amplitudeStorage的一个值)

我应该做的事情:

for (int i = 0; i < amplitudeStorage.size(); i++) 
       { 
        cout << amplitudeStorage[i] << endl; 
       } 
+1

这是一个想法。将其他过高的单行分解成几部分,并查看哪些行程中的哪一行导航引用了最终迭代器。我猜,'dataVector'是空的。当然,如果没有MCVE,那么你会得到很多。 – WhozCraig

+0

@WhozCraig yep只是检查了代码,一些存储在vectorStorage中的向量是空的。现在没有错误,但'amplitudeVariable'现在总是以'-1.07374e + 08'出现。任何想法为什么? –

+0

大声笑。不是线索,未初始化某些东西?但至少你知道为什么这个无效的引用是浮出水面的。很高兴你找到*那*。顺便说一句,也许给你的钻机上的复制缓冲区休息一下,并通过'const'引用传递该矢量,而不是通过值复制。只是说... = P祝你好运。 – WhozCraig

我使用的一些向量是空的,导致了错误。

查看完整的工作的例子。我尝试合编,没有任何问题。

#include <vector> 
#include <algorithm> 

using namespace std; 

vector<float> amplitudeStorage; 
vector< vector<float> > vectorStorage; 

void AssignWaveAmplitude(float& amplitudeVariable, const vector<float>& dataVectorr) { 
    if(dataVectorr.size()) { 
     amplitudeVariable = 0; 
     return; 
    } 
    amplitudeVariable = (*max_element(dataVectorr.begin(), dataVectorr.end())) - 
     (*min_element(dataVectorr.begin(), dataVectorr.end())); 
} 

main(){ 

    for (int i = 0; i < amplitudeStorage.size(); i++) { 
     AssignWaveAmplitude(amplitudeStorage[i], vectorStorage[i]); 
    } 

} 
+1

其实我认为你会发现std :: begin是完全有效的:http://en.cppreference.com/w/cpp/iterator/begin也适用于数组! – Goz

+0

是的,我发现,但不是解决的问题 –

+0

@ fl-web与您的答案我仍然得到同样的错误。 –

你的编译器可能正试图警告你,你不能正确指amplitudeStorage [I]对我的任何值,当amplitudeStorage矢量简直是空的。调整amplitudeStorage的大小以匹配vectorStorage的大小,或使用push_back。我更喜欢push_back。下面是一个完整的例子(它也避免了按值传递向量,并纠正了使用int来索引一个数据结构的问题,该数据结构的大小本身可以增长到大于最大值的一个数据结构)。

请注意,此代码使用C++ 11,因为它使用基于范围的for循环。您可能需要告诉编译器打开对C++ 11的支持。在C++ 11中有很多很好的方便。

#include <vector> 
#include <algorithm> 

using namespace std; 

float WaveAmplitude(const vector<float>& dataVectorr) { 
    return (*max_element(begin(dataVectorr), end(dataVectorr))) 
    - (*min_element(begin(dataVectorr), end(dataVectorr))); 
} 

vector<float> amplitudeStorage; 
vector<vector<float>> vectorStorage;  

int main(void) { 
    // Populate vectorStorage somehow here, replacing this comment. 
    amplitudeStorage.clear(); 
    for (const auto& wave : vectorStorage) 
    { 
     amplitudeStorage.push_back(WaveAmplitude(wave)); 
    } 
    return 0; 
}