c++ stl 声明对象的同时如何初始化?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ stl 声明对象的同时如何初始化?相关的知识,希望对你有一定的参考价值。

声明一个stl中像vector,list,set等等的对象的同时,如何对她们初始化?有哪些方法能在声明的同时初始化?这里不用push_back()函数咯。希望大家能帮助我,越详细越好,copy的也行,或教我如何查,或者到哪里查的方法也行,只要符合我上面说的两点要求,分很好说。我查msdn也没有查到,不知道是不是我的方法有问题。非常感激!万分感激!
哇,很感谢大家,有这么多的高手,受益匪浅啊!
其实不一定要在声明的同时初始化,声明过后初始化也行。
感谢大家的答案,都不知道哪个好了,采纳一个答案后,很想给每个给我意见的人分,不知道百度有没有这个功能。

如果是声明的时候就初始化,好像只有使用每个容器的带参数构造函数来初始化

除此之外,就是声明以后的初始化,
对于list, deque,vector, 使用 assign

对于下面的,
set, multiset, map, multimap 使用 insert
stack, queue, priority_queue 使用 push
不过对于这些实际上已经不算是是真正的初始化了。

list:

// list::assign
#include <iostream>
#include <list>
using namespace std;

int main ()

list<int> first;
list<int> second;

first.assign (7,100); // 7 ints with value 100

second.assign (first.begin(),first.end()); // a copy of first

int myints[]=1776,7,4;
first.assign (myints,myints+3); // assigning from array

cout << "Size of first: " << int (first.size()) << endl;
cout << "Size of second: " << int (second.size()) << endl;
return 0;


====================
output:
Size of first: 3
Size of second: 7
====================

vector:
// vector assign
#include <iostream>
#include <vector>
using namespace std;

int main ()

vector<int> first;
vector<int> second;
vector<int> third;

first.assign (7,100); // a repetition 7 times of value 100

vector<int>::iterator it;
it=first.begin()+1;

second.assign (it,first.end()-1); // the 5 central values of first

int myints[] = 1776,7,4;
third.assign (myints,myints+3); // assigning from array.

cout << "Size of first: " << int (first.size()) << endl;
cout << "Size of second: " << int (second.size()) << endl;
cout << "Size of third: " << int (third.size()) << endl;
return 0;


====================
output:
Size of first: 7
Size of second: 5
Size of third: 3
====================

deque:
// deque::assign
#include <iostream>
#include <deque>
using namespace std;

int main ()

deque<int> first;
deque<int> second;
deque<int> third;

first.assign (7,100); // a repetition 7 times of value 100

deque<int>::iterator it;
it=first.begin()+1;

second.assign (it,first.end()-1); // the 5 central values of first

int myints[] = 1776,7,4;
third.assign (myints,myints+3); // assigning from array.

cout << "Size of first: " << int (first.size()) << endl;
cout << "Size of second: " << int (second.size()) << endl;
cout << "Size of third: " << int (third.size()) << endl;
return 0;


====================
output:
Size of first: 7
Size of second: 5
Size of third: 3
====================

set:
// set::insert
#include <iostream>
#include <set>
using namespace std;

int main ()

set<int> myset;
set<int>::iterator it;
pair<set<int>::iterator,bool> ret;

// set some initial values:
for (int i=1; i<=5; i++) myset.insert(i*10); // set: 10 20 30 40 50

ret = myset.insert(20); // no new element inserted

if (ret.second==false) it=ret.first; // "it" now points to element 20

myset.insert (it,25); // max efficiency inserting
myset.insert (it,24); // max efficiency inserting
myset.insert (it,26); // no max efficiency inserting

int myints[]= 5,10,15; // 10 already in set, not inserted
myset.insert (myints,myints+3);

cout << "myset contains:";
for (it=myset.begin(); it!=myset.end(); it++)
cout << " " << *it;
cout << endl;

return 0;

====================
output:
myset contains: 5 10 15 20 24 25 26 30 40 50
====================
参考技术A 只要在声明对象的时候,增加初始化列表,使对象创建时调用对应的构造函数,即可完成同时初始化的操作。
具体调用方式,依赖于对象类型,及支持的构造函数。
以stl中的string类为例,如定义
string a;
即无参构造,将a初始化为空字符串。

string a("for test");
就是把string类型的对象a初始化为"for test"值。

具体对象支持的构造函数列表,可以查询STL的使用手册获取,根据程序需要灵活选择构造的参数个数和值。
参考技术B STL 一般来说没有 vector<int> vi = ....的这种用法
而是建议采用先初始化元素,然后再添加元素到容器中去的方法,这也是STL中容器的高效访问的来由。
参考技术C http://blog.chinahr.com/blog/kenlinc/post/98781
这是出自 C++ Primer中文版(第4版) 3.3 标准库vector类型
参考技术D http://www.cppreference.com/

随时可以查看

(C++) 如何将 stl 列表声明为 extern?

【中文标题】(C++) 如何将 stl 列表声明为 extern?【英文标题】:(C++) How to declare a stl list as extern? 【发布时间】:2010-10-11 02:21:43 【问题描述】:

我有:

std::list<Particle> particles;
std::list<Particle>::iterator particleit;

在我的 main.cpp 中。我需要在我的一个类文件中将这两个声明为 extern,但是当我尝试直接的方法时,我的编译器给了我一些关于缺少“>”的错误。我将如何解决这个问题?

【问题讨论】:

您确定包含&lt;list&gt;Particle 标头吗? 确切的代码和确切的错误信息肯定比英文描述更好。 “我需要将这两个都声明为 extern”——我对此表示怀疑! 【参考方案1】:
extern std::list<Particle> particles;

如果这不起作用,那么您还有其他错误。你是否包含了&lt;list&gt; 并且Particle 的定义在particles 被声明的地方可见?

【讨论】:

谢谢。它现在编译。但是我现在遇到了应用程序冻结的另一个问题。不过,我可能会解决这个问题。再次感谢。 这可能会导致初始化顺序失败......最佳实践是 static 函数本地。 对,“冻结”可能来自于在初始化之前尝试访问全局对象。最佳做法是完全避免非本地对象,但如果你觉得你必须这样做,而不是使用设计良好的单人持有人......

以上是关于c++ stl 声明对象的同时如何初始化?的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL之tuple详解

c++ stl 几种容器,怎么在声明的时候直接带着大小

如何使用C++ STL中的链表list

在 C++ 中初始化对象之前声明一个对象

STL中vector的初始化

如何在构造函数中初始化 C++ 对象成员变量?