向量迭代器不可取消引用 C++
vector iterator not dereferencable C++
我正在尝试使用向量中的 (max_element-min_element) 来设置浮点数的值。我正在循环其中的几个,因此是浮点向量和向量向量。
我收到以下错误:
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)));
}
有谁知道如何解决这个问题?
非常感谢。
EDIT1:这个问题的解决方案是对这个问题的第一个评论。我使用的一些向量是空的,这导致了错误。
编辑 2:
@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)));
}
但浮点数仍然相同。知道为什么吗?
EDIT3:事实证明,浮点数输出错误的原因是因为我输出错误。
我在做:
cout << lowerBackYAmplitude<< endl
(这是 amplitudeStorage 中的值之一)
我应该做的:
for (int i = 0; i < amplitudeStorage.size(); i++)
{
cout << amplitudeStorage[i] << endl;
}
查看完整的示例。我尝试co compile没有问题。
#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]);
}
}
您的编译器可能试图警告您,当 amplitudeStorage 向量为空时,您无法正确引用 amplitudeStorage[i] 以获得 i 的任何值。在开始时调整 amplitudeStorage 的大小以匹配 vectorStorage 的大小,或者使用 push_back
。我更喜欢push_back
。这是一个完整的示例(它也避免了按值传递向量并更正了使用 int
索引数据结构的代码中的问题,该数据结构的大小本身可以增长到超过 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;
}
我使用的一些向量是空的,这导致了错误。
我正在尝试使用向量中的 (max_element-min_element) 来设置浮点数的值。我正在循环其中的几个,因此是浮点向量和向量向量。
我收到以下错误:
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)));
}
有谁知道如何解决这个问题?
非常感谢。
EDIT1:这个问题的解决方案是对这个问题的第一个评论。我使用的一些向量是空的,这导致了错误。
编辑 2:
@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)));
}
但浮点数仍然相同。知道为什么吗?
EDIT3:事实证明,浮点数输出错误的原因是因为我输出错误。
我在做:
cout << lowerBackYAmplitude<< endl
(这是 amplitudeStorage 中的值之一)
我应该做的:
for (int i = 0; i < amplitudeStorage.size(); i++)
{
cout << amplitudeStorage[i] << endl;
}
查看完整的示例。我尝试co compile没有问题。
#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]);
}
}
您的编译器可能试图警告您,当 amplitudeStorage 向量为空时,您无法正确引用 amplitudeStorage[i] 以获得 i 的任何值。在开始时调整 amplitudeStorage 的大小以匹配 vectorStorage 的大小,或者使用 push_back
。我更喜欢push_back
。这是一个完整的示例(它也避免了按值传递向量并更正了使用 int
索引数据结构的代码中的问题,该数据结构的大小本身可以增长到超过 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;
}
我使用的一些向量是空的,这导致了错误。