标签: stdmap

不寻常的std :: map运行时错误

我正在为一个我正在研究的游戏编辑一个黑客,作为该编辑器的一部分,显然我需要有纹理.我已经创建了一个std :: map变量,

std::map<std::string, unsigned int> textures;
Run Code Online (Sandbox Code Playgroud)

在我的图片加载代码中,我有以下代码段.

unsigned int id;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageWidth, imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, imageData);
glBindTexture(GL_TEXTURE_2D, 0);

textures[filename] = id;
Run Code Online (Sandbox Code Playgroud)

现在由于某种原因,我在尝试使用上面的代码后出现运行时错误.一个访问冲突错误,在调试时,我指向std :: map代码本身,具体来说,这部分:

_Nodeptr _Lbound(const key_type& _Keyval) const
    {   // find leftmost node not less than _Keyval
    _Nodeptr _Pnode = _Root(); // ** this is the highlighted line **
    _Nodeptr _Wherenode = _Myhead;  // end() if search fails

    while (!_Isnil(_Pnode))
        if (_DEBUG_LT_PRED(this->comp, _Key(_Pnode), _Keyval))
            _Pnode …
Run Code Online (Sandbox Code Playgroud)

runtime stdmap

5
推荐指数
0
解决办法
2367
查看次数

std::map 的单元测试

有谁知道我在哪里可以找到将进行测试的单元测试std::map

我问的原因是因为我编写了一个类来替代它std::map并且具有几乎所有相同的功能,因此单元测试std::map也适用于我的类。

当然,我可以自己编写,但是如果有人已经为此编写了大量测试,那么这将为我节省大量时间,并有望涵盖我可能遗漏的内容。

谢谢。

c++ testing unit-testing stl stdmap

5
推荐指数
1
解决办法
1656
查看次数

std :: map和-fno-implicit-templates

我试图用g ++ 4.4编译并链接一个使用STL的简单程序.我正在尝试使用-fno-implicit-templates来完成它,因此必须显式实例化所有模板.

我不明白为什么这段代码有效:

#include <map>
//template class std::map<char,char>;
template class std::_Rb_tree<char, std::pair <char const, char>,
               std::_Select1st<std::pair<char const, char> >, 
               std::less<char>, std::allocator<std::pair<char const, char> > >;

int main() {
   std::map <char,char> table;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望这个程序需要行:template class std::map<char,char>;但是该行不会使程序链接.这std::_Rb_tree line是必要的.为什么?

在此先感谢,任何提示将不胜感激.

c++ stl instantiation stdmap

5
推荐指数
1
解决办法
306
查看次数

c ++ 03:std :: map中内置类型的默认构造函数

我一直以为代码如下

std::map<int, int> test;
std::cout << test[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)

会打印随机值,因为它会在map中创建单位化值.但是,事实证明,创建的int实际上总是初始化为零,并且标准内置类型在某些情况下也是零初始化的.

问题是:当对标准类型(int/char/float/double/size_t)执行零初始化时?我很确定,如果我int i;在不知名的地方宣布,它将包含随机数据.

PS问题是关于C++ 03标准.问题的原因是,现在我不再确定何时必须为内置类型(如int/float/size_t)提供初始化,或者可以安全地省略它.

c++ stdmap c++03

5
推荐指数
1
解决办法
1629
查看次数

映射包含抽象基类的ptr_map的对象

我有一个boost::ptr_map存储抽象基类(例如VectorWrapperBase)作为值,这允许我将字符串映射到不同类型的向量.

boost::ptr_map<std::string, VectorWrapperBase> memory_map;
//...
memory_map.insert(str_key, new VectorWrapper<T>());
Run Code Online (Sandbox Code Playgroud)

这似乎有效.但是,当我memory_map作为另一个类的成员并尝试将该类存储在一个中时std::map,编译失败.

class AgentMemory {
  //...
  private:
    boost::ptr_map<std::string, VectorWrapperBase> memory_map;
};

std::map<std::string, AgentMemory> agent_map;
//...
agent_map.insert(std::pair<std::string, AgentMemory>(agent_name, AgentMemory()));
Run Code Online (Sandbox Code Playgroud)

最后一行失败了:

/SOMEPATH/boost_1_48_0/boost/ptr_container/clone_allocator.hpp:34
   error: cannot allocate an object of abstract type ‘xyz::VectorWrapperBase’
Run Code Online (Sandbox Code Playgroud)

作为C++的新手,这是令人费解的.

怀疑错误是由于地图插入复制了AgentMemory涉及克隆的对象ptr_map.由于我的VectorWrapper对象不可复制,因此会引发错误.

我的问题是:

  • 为什么我收到错误?(我的怀疑是否接近实际发生的事情?)
  • 我该如何解决这个问题?

为了解决编译错误,我考虑了以下内容,但是没有太多C++经验无法确定哪个更合适:

  1. 删除纯说明符(= 0),因此VectorWrapperBase不再是抽象的
    • 这感觉就像一个黑客,因为VectorWrapperBase永远不应该被实例化
  2. 使VectorWrappers 可以复制
    • 这似乎有效,但在我的用例中,只有空容器被分配给顶层映射,因此内部的VectorWrappers ptr_map永远不会被克隆.因此,克隆性只是为了安抚编译器而不反映实际用法.
  3. 忘记ptr_map并使用一个std::map而 …

c++ abstract-class stdmap boost-ptr-container

5
推荐指数
1
解决办法
543
查看次数

C++,通过const引用访问std :: map元素

const有问题.说我有:

class A{
    friend std::ostream& operator<<(std::ostream& os,const A& myObj);

   private:
    std::map<int,int> someMap;
    int someInteger;
 };
 std::ostream& operator<<(std::ostream& os,const A& myObj){
  os<<myObj.someInteger<<std::endl;
  os<<myObj.someMap[0]<<std::endl;
  }
Run Code Online (Sandbox Code Playgroud)

由于与地图的const冲突,这种代码在编译时会产生错误(如果我注释打印地图值的行一切都很好),如果我摆脱了函数原型中的'const',一切都很好.我真的没有看到问题在哪里..

有什么帮助吗?

c++ stl stdmap

5
推荐指数
1
解决办法
2895
查看次数

std :: map分配错误

我面临着std :: map的问题。出于未知原因,有时插入映射会导致“分配错误”异常。

以下是我用于插入地图的函数。

BOOL Add2WaitList(Object<LPVOID> *newObj)
{
    try
    {
        _set_se_translator( trans_func );
        m_syncWQ.Lock();
        if (m_waitingQueue.count(newObj->uid)>0)
        {
            m_syncWQ.Unlock();
            return FALSE;
        }
        m_waitingQueue[newObj->uid] = *newObj; <-- failing here
        m_syncWQ.Unlock();
        return TRUE;
    }
    catch(std::exception &ex){
        ...
    }
    catch(SE_Exception &e){
        ...
    }
    catch(...){
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我如何解决吗?

注意:我无法确定重现它的步骤。

提前THX!

添加有关对象和地图的详细信息:

template <typename T>
struct Object{
public:
    void Kill()
    {
        if (response!=NULL)
            delete response;
        if (object!=NULL)
            delete object;
    }

    enum objType;
    std::string uid;
    enum status;
    double p;
    enum execType;
    T object;
    LPVOID response;
}; …
Run Code Online (Sandbox Code Playgroud)

c++ stdmap bad-alloc

5
推荐指数
1
解决办法
3721
查看次数

一个偶然的作家,std :: map的多个频繁读者

我在这里遇到并发问题.我有一个std::map,有一个偶尔的作家和来自不同线程的多个频繁读者,这个作者偶尔会std::string在地图上添加键(键是a ),我无法保证读者何时执行阅读和停止阅读.我不想为读者设置锁,因为阅读非常频繁并经常检查锁会损害性能.

如果读者总是通过键(而不是map迭代器)访问映射,它是否总是线程安全的?如果没有,任何想法如何设计代码,以便读者总是访问有效的键(或map迭代器)?

使用不同容器解决该问题的其他方法也是受欢迎的.

c++ multithreading stdmap c++11

5
推荐指数
2
解决办法
1006
查看次数

为什么map.erase返回迭代器?

我想要从beginIt到endIt擦除std :: map的元素.erase函数将迭代器返回到删除的最后一个元素后面的元素.不是它的结束吗?为什么擦除返回迭代器?

auto it = m_map.erase(beginIt, endIt);
Run Code Online (Sandbox Code Playgroud)

c++ stdmap erase

5
推荐指数
2
解决办法
667
查看次数

为什么std :: map有一个find成员函数?

我和一位同事正在讨论成员与非成员职能的相对优点.出现了一个问题:为什么std::map会有find成员函数.

我的回答是,尽管您可以std::find在地图上使用,但您必须搜索键值对,或使用find_if和例如lambda.但是,这是线性的,并且map.find在线性时间内提供了按键搜索.我最后断言,如果它可能是一个非成员,那么它本来就是!(虽然,std :: string表明我的概括可能有些仓促).

我的同事指出,可以采用find与非成员函数相同的方式实现map.lower_bound.

是否有一个理由map.find已经制成的零件?

c++ stl stdmap

5
推荐指数
1
解决办法
240
查看次数