我正在为一个我正在研究的游戏编辑一个黑客,作为该编辑器的一部分,显然我需要有纹理.我已经创建了一个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) 有谁知道我在哪里可以找到将进行测试的单元测试std::map?
我问的原因是因为我编写了一个类来替代它std::map并且具有几乎所有相同的功能,因此单元测试std::map也适用于我的类。
当然,我可以自己编写,但是如果有人已经为此编写了大量测试,那么这将为我节省大量时间,并有望涵盖我可能遗漏的内容。
谢谢。
我试图用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是必要的.为什么?
在此先感谢,任何提示将不胜感激.
我一直以为代码如下
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)提供初始化,或者可以安全地省略它.
我有一个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++经验无法确定哪个更合适:
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',一切都很好.我真的没有看到问题在哪里..
有什么帮助吗?
我面临着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) 我在这里遇到并发问题.我有一个std::map,有一个偶尔的作家和来自不同线程的多个频繁读者,这个作者偶尔会std::string在地图上添加键(键是a ),我无法保证读者何时执行阅读和停止阅读.我不想为读者设置锁,因为阅读非常频繁并经常检查锁会损害性能.
如果读者总是通过键(而不是map迭代器)访问映射,它是否总是线程安全的?如果没有,任何想法如何设计代码,以便读者总是访问有效的键(或map迭代器)?
使用不同容器解决该问题的其他方法也是受欢迎的.
我想要从beginIt到endIt擦除std :: map的元素.erase函数将迭代器返回到删除的最后一个元素后面的元素.不是它的结束吗?为什么擦除返回迭代器?
auto it = m_map.erase(beginIt, endIt);
Run Code Online (Sandbox Code Playgroud) 我和一位同事正在讨论成员与非成员职能的相对优点.出现了一个问题:为什么std::map会有find成员函数.
我的回答是,尽管您可以std::find在地图上使用,但您必须搜索键值对,或使用find_if和例如lambda.但是,这是线性的,并且map.find在线性时间内提供了按键搜索.我最后断言,如果它可能是一个非成员,那么它本来就是!(虽然,std :: string表明我的概括可能有些仓促).
我的同事指出,可以采用find与非成员函数相同的方式实现map.lower_bound.
是否有一个理由map.find已经制成的零件?