以下の方法は、さまざまな数値セットのグループ化から特定の数値が何回出現するかを追跡しています
void build_prob_distro(const std::vector<Foo>& num_sets, std::map<int, int>& prob_distro){
int key;
Foo cur_foo;
for(unsigned int foo_num = 0; foo_num<num_sets.size(); foo_num++){
cur_foo = num_sets.at(foo_num);
key = 0;
int val;
for(int cur_foo_num=0; cur_foo_num<cur_foo.get_foo_length(); cur_foo_num++){
std::cout << cur_foo.get_num_at(cur_foo_num)*std::pow(10, cur_foo.get_foo_length()-cur_foo_num-1) << std::endl;
val = cur_foo.get_num_at(cur_foo_num)*std::pow(10, cur_foo.get_foo_length()-cur_foo_num-1);
std::cout << val << std::endl;
key = key + cur_foo.get_num_at(cur_foo_num)*std::pow(10, cur_foo.get_foo_length()-cur_foo_num-1);
}
prob_distro[key] += 1;
}
}
私が直面している問題は、std::pow() メソッドを使用してマップのキー値を計算するときです。100 を超えるものはすべて -1 ずれています (つまり、100 が 99 になり、103 が 102 になるなど)。std::cout を使用して計算を出力すると、結果は正しいのですが、値を int 変数に代入するとすぐに -1 エラーが発生します。私はコードを何度も見直しましたが、すぐに問題が発生することはありません。この問題の原因とその理由に関する提案はありますか?
foo クラスがこの例/問題にとって重要すぎるとは思いませんが、実際に何らかの問題の原因である場合に備えて投稿します。
//Foo.h
#ifndef FOO_H
#define FOO_H
#include <string>
#include <vector>
class Foo
{
public:
Foo();
Foo(const std::vector<int>& nums);
int get_num_at(int pos) const;
int get_foo_length() const;
std::string to_string() const;
private:
std::vector<int> nums;
};
#endif // Foo_H
//Foo.cpp
#include "Foo.h"
#include <string>
Foo::Foo(const std::vector<int>& nums){
for(int i=0; i<nums.size(); i++){
this->nums.push_back(nums.at(i));
}
}
Foo::Foo(){}
/* SETTERS & GETTERS */
int Foo::get_num_at(int pos) const{
if(nums.size() != 0){
return nums[pos];
}
return -1;
}
int Foo::get_foo_length() const{
return nums.size();
}
/* END SETTERS & GETTERS */
std::string Foo::to_string() const{}
編集: ベクトルで Foo クラスよりも簡単なものを使用することをすぐに指摘する人もいますが、各セットに組み込む必要がある他の機能があるため、これが関連するコードをまとめるための最良の方法でした。興味のある任意の長さの整数値を表すことができるようにします (つまり、foo は 10000 を表すのと同じくらい簡単に 1 を表すことができます)。