e**********n 发帖数: 359 | 1 #include "temp.hh"
#include
main() {
StringSet constStrs;
for(StringSet::iterator it = constStrs.begin(); it!=constStrs.end();
it++) {
std::cout << *it <<" ";
}
}
其中 “temp.hh" 为:
#include
#include
class StringSet : public std::set {
public:
StringSet(){
insert( std::string("0"));
insert( std::string("1"));
......
insert( std::string("3999"));
};
};
总共往StringSet里添加了4000个字符串,此处为了简单用0到3999,但实际上可以是任
意的字符串。
用 g++ -g 编译很快完事 |
e**********n 发帖数: 359 | 2 把set换成list或vector,还是有同样的问题。
);
【在 e**********n 的大作中提到】 : #include "temp.hh" : #include : main() { : StringSet constStrs; : for(StringSet::iterator it = constStrs.begin(); it!=constStrs.end(); : it++) { : std::cout << *it <<" "; : } : } : 其中 “temp.hh" 为:
|
p***o 发帖数: 1252 | 3 要是最新版本也有问题就去报告个bug把。
【在 e**********n 的大作中提到】 : 把set换成list或vector,还是有同样的问题。 : : );
|
d****p 发帖数: 685 | 4 This program should work, but poorly written.
Never inherit from STL container class. |
h*******u 发帖数: 15326 | 5 实在没搞明白stl这些container为什么就不给个virtual析构函数,
有时候如果能继承stl容器真是方便多了
【在 d****p 的大作中提到】 : This program should work, but poorly written. : Never inherit from STL container class.
|
e**********n 发帖数: 359 | 6 I moved the strings to a global array
char *constStr[] = {"0", "1"...."3999"};
and inserted the strings into a StringSet using a for loop. This time g++ -O3
finished quickly, and the size of
the executable file is also 10 times smaller.
I don't think inheriting from STL container is the cause here. g++ seems to
do too much optimization for the
4000 lines of insert(...), also probably in an incorrect way. The for loop
gives g++ little to optimize.
【在 d****p 的大作中提到】 : This program should work, but poorly written. : Never inherit from STL container class.
|
d****p 发帖数: 685 | 7 For performance reasons. calling virtual function is slow.
【在 h*******u 的大作中提到】 : 实在没搞明白stl这些container为什么就不给个virtual析构函数, : 有时候如果能继承stl容器真是方便多了
|
X****r 发帖数: 3557 | 8 继承往往是错误的修改已有类行为的方式。
【在 h*******u 的大作中提到】 : 实在没搞明白stl这些container为什么就不给个virtual析构函数, : 有时候如果能继承stl容器真是方便多了
|
d**a 发帖数: 84 | 9 这样写没啥问题, 你为啥要继承呢?
====================================================
using namespace std;
typedef set StringSet;
inline string to_string(int i) {
stringstream ss;
ss<
return ss.str();
}
int main() {
StringSet constStrs;
for(int i=0; i<4000; ++i) {
constStrs.insert(to_string(i));
}
for(StringSet::iterator it = constStrs.begin(); it!=constStrs.end();
it++) {
std::cout << *it <<" ";
}
}
);
【在 e**********n 的大作中提到】 : #include "temp.hh" : #include : main() { : StringSet constStrs; : for(StringSet::iterator it = constStrs.begin(); it!=constStrs.end(); : it++) { : std::cout << *it <<" "; : } : } : 其中 “temp.hh" 为:
|
d**a 发帖数: 84 | 10 下面在我这里也没问题
Ubuntu 2.6.28-15-generic, x86_64
g++ (Ubuntu 4.3.3-5ubuntu4) 4.3.3
============================
#include "temp.hh"
#include
main() {
StringSet constStrs;
for(StringSet::iterator it = constStrs.begin(); it!=constStrs.end();
it++) {
std::cout << *it <<" ";
}
}
===============temp.hh===============
#include
#include
#include
using std::string;
using std::stringstream;
inline string to_string(int i) {
str
【在 e**********n 的大作中提到】 : #include "temp.hh" : #include : main() { : StringSet constStrs; : for(StringSet::iterator it = constStrs.begin(); it!=constStrs.end(); : it++) { : std::cout << *it <<" "; : } : } : 其中 “temp.hh" 为:
|