C++int出现次数,范围未知
C++ int occurrence count with unknown range
这会很长,所以我提前道歉。但我想确保上下文被理解,因为我已经阅读了许多关于这个主题的帖子。我所发现的没有一个能解决基于未知数字范围统计数字的问题。
我试图确定一个集合中每个整数的总出现次数。我遇到的问题是,测试集是固定的,比如说10个数字的数组,但每个数字的范围是未知的。所带来的问题是,当试图使用数组来统计总数时,数组范围在运行时不能是可变的。我使用vector<int> ArrayName
重试了这一尝试,而我可以在运行时重新调整总计数组的大小,但在计算中使用vector<int>
值时遇到了错误。
我将要介绍的代码是使用OpenCV
进行人脸检测。我研究并使用了各种样本中的代码来创建一个基本的检测程序,然后研究并移植了一些Java代码来处理人脸移动和更新到新位置时的跟踪。所有这些代码都在工作。
我想使用请求的信息的地方是,我想存储最后一个(比如10
)人脸检测到的受试者的数组,并找到随着时间的推移检测到最多的一个,并将其视为受试者。假设我们检测到10帧,最后10帧检测如下(-1是未知人脸):-1, -1, 0, 0, 0, 3, 0, -1, 0, 2
。计数后,0
出现频率最高,因此受试者为0
。范围未知的原因是受试者ID取决于训练的受试者数量,并且总是在变化。
这三个错误是(用//ERROR表示):
invalid use of member (did you forget the '&' ?),
no match for call to '(std::vector<int>) (int)',
no match for call to '(std::vector<int>) (int)&'
这是代码:
struct FaceStruct {
private:
static const int NewLife = 120; //Divide by FPS for Length in Time
static const int TotalTrackedSubjects = 10;
int Life;
vector<int> Subjects;
public:
void Init( Rect, int );
void addSubject( int );
int Subject();
Rect Location;
bool Used;
void Weaken();
void Renew();
bool Dead();
};
void FaceStruct::Init( Rect location, int subject = -1 ) {
Location = location;
Subjects.resize( TotalTrackedSubjects - 1 );
for( int i = 0; TotalTrackedSubjects - 1; i++ ) {
Subjects(i) = -1; //ERROR
}
Renew();
}
void FaceStruct::addSubject( int subject ) {
for( int i = 0; TotalTrackedSubjects - 2; i++ ) {
Subjects(i) = Subjects( i + 1 ); //ERROR
}
Subjects( TotalTrackedSubjects - 1 ) = subject; //ERROR
}
int FaceStruct::Subject() {
int count_range = -1;
for( int i = 0; TotalTrackedSubjects - 1; i++ ) {
if( Subjects(i) > count_range ) count_range = Subjects(i); //ERROR
}
if( count_range < 0 ) { //Subject Unknown
return -1;
} else if( count_range == 0 ) { //Subject is 0, Handle 0's
int totals = 0;
for( int i = 0; TotalTrackedSubjects - 1; i++ ) {
if( Subjects(i) == 0 ) totals++; //ERROR
}
return totals;
} else { //Use count_range
vector<int> totals;
int unknowns = 0;
totals.resize( count_range );
for( int i = 0; TotalTrackedSubjects - 1; i++ ) {
if( Subjects(i) < 0 ) { //ERROR
unknowns++;
} else {
totals( Subjects(i) ) = totals( Subjects(i) ) + 1; //ERROR
}
}
int largest = -1;
for( int i = 0; totals.size() - 1; i++ ) {
if( totals(i) > largest ) largest = totals(i); //ERROR
}
return largest;
}
}
void FaceStruct::Weaken() {
Life--;
}
void FaceStruct::Renew() {
Life = NewLife;
}
bool FaceStruct::Dead() {
if( Life < 1 ) {
return true;
} else {
return false;
}
}
要访问数组中的项,应该使用[]而不是()
所以Subjects(i)
应该是Subjects[i]
和totals( Subjects(i) ) = totals( Subjects(i) ) + 1;
应为totals[ Subjects[i] ] = totals[ Subjects[i] ] + 1;
听起来地图可以做得很好。。。
#include <map>
int example_values[10] = {-1, -1, 0, 0, 0, 3, 0, -1, 0, 2};
map<int, int> counts;
for (int i = 0; i < 10; ++i) ++counts[example_values[i]];
for (map<int, int>::iterator i = counts.begin(); i != counts.end(); ++i)
cout << i->first << ": " << i->second << endl;
输出:
-1: 3
0: 5
2: 1
3: 1
(它们可能不是按那个顺序排列的。我觉得它们会的,但我忘了地图是如何排列内容的。)
代码有一些问题:
1) 矢量的数组访问使用数组下标运算符[],而不是函数运算符()
2) 方法和成员的命名使用了不一致的样式,成员和方法应仅基于名称进行区分。拥有一个成员和方法的不同之处在于只有一个容易错过的"s",这会带来麻烦。
3) 考虑使用映射或优先级队列而不是向量,这应该会删除许多非算法细节。
您的循环条件看起来是错误的。
for( int i = 0; TotalTrackedSubjects - 1; i++ ) {
这相当于写:
int i = 0;
while(9){
...
i++
}
for循环构造的第二部分是退出条件。
我认为是:
for( int i = 0; i < TotalTrackedSubjects; i++ ) {
否则你的循环将永远不会停止。
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 继承期间显示未知行为的子类
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 输入中的字符串数未知(以字母表示)
- 具有未知值时的时间复杂性
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 如何从未知视图中声明范围::v3::View 变量
- C++int出现次数,范围未知
- 编译器可以报告未知属性上的错误吗?即使有范围
- C++ -- 为什么"什么"在捕获范围内打印"未知异常"?