gpt4 book ai didi

c++ - 填充 C++ std::map 时丢失字段

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:06 25 4
gpt4 key购买 nike

我在正确使用 std::map 时遇到问题。 Example 类是一个具有 ID、标签、关键点 vector 和描述符矩阵的类。 Examples 类是一个映射,用于在给定 ID 的情况下检索示例。这些示例从磁盘上的文件中读取,存储在 map 中,然后在以后使用。

即使在概念上非常简单,我也无法正确填充 map 。

我有以下类(class):

class Example
{
public:
std::string id;
std::string label;
std::vector<cv::KeyPoint> keypoints;
cv::Mat descriptors;

Example(std::string id_, std::string label_)
: id(id_), label(label_)
{
// ... nothing ...
}

string to_string() const
{
stringstream ss;
ss << "@" << id
<< " (" << label << ")"
<< " - #keypoints " << keypoints.size()
<< ", descr " << descriptors.rows << " x " << descriptors.cols;
return ss.str();
} // to_string

}; // class Example

ostream& operator <<(ostream & out, const Example &ex)
{
out << ex.to_string();
return out;
} // operator <<

还有这个:

 // OLD: class Examples : public std::map<std::string, Example*> {
class Examples {
// New line after Martini's comment
std::map<std::string, Example*> _map;
[...]
void fill() {
// create an example
Example *example = new Example(id, label);

// inputstream in

// Read all the keypoints
cv::KeyPoint p;
for(int i=0; ... ) {
in.read(reinterpret_cast<char *>(&p), sizeof(cv::KeyPoint));
example->keypoints.push_back(p); // push_back copies p
} // for

// ... misc code

cv::Mat descr(n_keypoints, d_size, cv_type, cv::Scalar(1));
// ... read Mat from inputstream in, then assign it to the example
example->descriptors = descr;


// SEE THE OUTPUT BELOW
std::cout << "INSERT THIS: " << (*example) << std::endl;
_map.insert(std::pair<string,Example*>(id, example));
std::cout << "READ THIS: " << *(get_example(id)) << std::endl;

// ... other code
} // fill

// Code modified after Martini's comment.
Example* get_example(const std::string &id) const {
std::map<std::string, Example*>::const_iterator it = _map.find(id);
if( it == _map.end()) {
// ... manage error
// ... then exit
} // if
return it->second;
} // get_example


} // class Examples

insert/get 行的输出是:

 INSERT THIS: @122225084 (label) - #keypoints 711, descr 711 x 128
READ THIS: @122225084 (label) - #keypoints 0, descr 0 x 0

在插入中,我有一个指向具有 711 个关键点和 711x128 描述符矩阵的示例的指针。如果我在插入后立即使用其 ID 读取示例,我会得到一个指向具有 0 个关键点和空矩阵的示例的指针。

我做错了什么?

最佳答案

查看您的代码,一种可能的解释是 map 中已有具有相同键的元素。要在添加对象之前和之后首先诊断指针的打印值(类似这样):

std::cout << "INSERT THIS: " << (void *)example << " " << (*example) << std::endl;
_map.insert(std::pair<string,Example*>(id, example));
std::cout << "READ THIS: " << (void *)get_example(id) << " " << *(get_example(id)) << std::endl;

下一步或另一种方法是检查插入结果:

if( !_map.insert(std::pair<string,Example*>(id, example)).second ) 
std::cout << "ERROR: example:" << id << " is already there";

如果你想无条件覆盖元素你可以使用oprator[]:

_map[ id ] = example;

如果确实存在重复项,您将发生内存泄漏(无论如何您都会发生内存泄漏),因此我强烈建议您使用智能指针在 map 中存储数据。

关于c++ - 填充 C++ std::map 时丢失字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14727996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com