浅析常用STL中容器插入数据失败

昨天在上班的时候,碰到一个问题,关于 STL常用容器插入数据失败。

问题详细:在一个类构造函数填零后,那么map list 插入数据失败了,但是vector不会。测试代码如下:

class Test
{
public:

    Test(){memset(this,0,sizeof(*this));}
    void InsertElement(){m_map.insert(std::make_pair(1,1));   }
    void InsetElement_vector(){ m_vector.push_back(1);}
    void InserElementList(){m_list.push_front(1);}
private:
    std::map<int,int>  m_map;
    std::vector<int> m_vector;
    std::list<int> m_list;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Test p ;
    p.InsertElement();
    p.InsetElement_vector();
    p.InserElementList();
    return 0;
}

其中 vecotr 成功,其余两个容器失败。~开始百思不得其解,估计着是  容器有特殊隐藏的数据结构,填0破坏了 容器的数据结构。。。。

后来请教诸神,总结答案如下:

非 pod 类型不要memset()初始化,会导致未定义行为,实际上就是破坏数据完整性。

关于POD类,相信有一部分人有点想不起它的定义,关于它的定义用简单的描述如:一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型。

时间: 2024-08-06 15:59:45

浅析常用STL中容器插入数据失败的相关文章

AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论

1.背景 在多个项目中,当我方接口给其他部门人员使用时出现了插入数据失败或者插入的数据在WMTS请求中无法显示出来的问题.针对这些问题,我在这篇文章中,将详细描述造成以上问题的原因.在此WebGIS产品的前台和后台接口中,此插入数据核心部分均是FeatureServer请求.所以我们首先对FeatureSever服务做一个大致的了解. 2.FeatureServer服务的大致了解 2.1 FeatureServer服务提供的功能 FeatureServer服务可以提供如下几种服务: 我们可以得出

当插入数据失败时,防止mysql自增长字段的自增长的方法

问题描述: 当mysql设置了自增长字段时(注意:一个表中只能设置一个自增长字段,可以不是主键,但必须是键 ),如果插入数据失败,那么自增长字段仍然会占用这个自增长值,再次成功插入数据时就会造成断层. 原因: 自增是缓存在内存字典中的,分配方式是先预留,然后再插入的.所以插入失败不会回滚内存字典. 解决方法: 在php程序中可以加一段代码,当插入数据失败时,执行sql语句重新设置auto_increment的值: $sql = alter table `tbname` auto_incremen

mysql 插入数据失败防止自增长主键增长的方法

mysql设置了自增长主键ID,插入失败的那个自增长ID也加一的,比如失败5个,下一个成功的不是在原来最后成功数据加1,而是直接变成加6了,失败次数一次就自动增长1了,能不能让失败的不增长的? 或者说mysql插入数据失败,怎么能防止主键增长? MYSQL不保证AUTO_INCREMENT依次增长(1,2,3,4,5),但是可以保证正向增长(1,3,5,9)所以,当你某次操作失败后,下次AUTO_INCREMENT就不是顺序的了. innodb的自增是缓存在内存字典中的,分配方式是先预留,然后再

向mysql中批量插入数据的性能分析

MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 50 ) NOT NULL,value VARCHAR( 50 ) NOT NULL,other_value VARCHAR( 50 ) NOT NULL) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example(example_id, name, valu

STL中容器的push()或者push_back()函数的一点说明

在STL的queue 或者 vector.list等容器适配器或者容器中,会经常用到的函数就是push()或者push_back()函数,但是有一点需要明确的是: 在使用这些函数对容器/适配器对象增加新元素的时候,实际上是对原有的元素对象复制重新新建了一个元素对象作为元素压入到容器/适配器对象中. 例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include<queue> #include<iostream> u

vc 在edit控件中动态插入数据滚动显示

内存从网上论坛摘抄整理 思路:给控件设置多行属性,设置垂直滚动条,Auto Vscroll设置为true,放入文本后把插入点设置到末尾 pEdit->LineScroll(pEdit->GetLineCount()); 滚动条滚动到最下端 int len  = pEdit->GetWindowTextLength(); pEdit->SetSel(len,-1,true); //定位光标到内容末尾pEdit->ReplaceSel("12121212");

oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号?

Oracle 语句中"||"代表什么啊? oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号? 排序的话,用order by来处理即可.比如:cola123a234b999b335select * from tablename order by col; 结果就是 cola123a234b335b999 如果按倒序排列:select * from tablename order by col desc; 结果就是 colb999b335a234a123 其他回答 先创

db2插入数据失败

使用db2,手动insert语句的时候,报如下错误: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=2 . 开始在网上找解决方法,以下网上的解决方法总结(事实上并没有解决我的问题): 第一种解决: 1.查了下,大概意思是违反了唯一性约束啊! 2.不过,我db2 describe table XX后发现这个表只有ID是不能为空的啊! 3.最后,直接写了条SQL在命令行执行,同样的错和代码 最后,我查了下表的索引,发现建了个组合索引,才恍

Mysql向表中循环插入数据

今天学习Mysql,做实验时想向一个标准插入1000行数据,在oracle中类似于这样 begin for i in 1..1000 loop insert .. end loop; end; / 但是Mysql中不支持匿名块 百度了一下,方法如下: 首先设置delimiter delimiter的作用:告诉解释器,这段命令是否已经结束了,mysql是否可以执行了 默认情况下,delimiter是':'但是当我们编写procedure时,如果是默认设置,那么一遇到':',mysql就要执行,这是