向量迭代器不可忽略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;
}
我使用的一些向量是空的,导致了错误。
查看完整的工作的例子。我尝试合编,没有任何问题。
#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]);
}
}
其实我认为你会发现std :: begin是完全有效的:http://en.cppreference.com/w/cpp/iterator/begin也适用于数组! – Goz
是的,我发现,但不是解决的问题 –
@ 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;
}
这是一个想法。将其他过高的单行分解成几部分,并查看哪些行程中的哪一行导航引用了最终迭代器。我猜,'dataVector'是空的。当然,如果没有MCVE,那么你会得到很多。 – WhozCraig
@WhozCraig yep只是检查了代码,一些存储在vectorStorage中的向量是空的。现在没有错误,但'amplitudeVariable'现在总是以'-1.07374e + 08'出现。任何想法为什么? –
大声笑。不是线索,未初始化某些东西?但至少你知道为什么这个无效的引用是浮出水面的。很高兴你找到*那*。顺便说一句,也许给你的钻机上的复制缓冲区休息一下,并通过'const'引用传递该矢量,而不是通过值复制。只是说... = P祝你好运。 – WhozCraig