Home
Main website
Display Sidebar
Hide Ads
Recent Changes
View Source:
C++Notes
Edit
PageHistory
Diff
Info
LikePages
!!!C++ STL Documentation Remember to read the STL specs in relatively plain English on the [SGI STL site|http://www.sgi.com/tech/stl/]. ---- !!!C++ Shared Library Woes I (SamJansen) was having a problem after making a C++ shared library. The error produced when I tried to run my application which loaded the library with [dlopen(3)] was: mylibrary.so: undefined symbol: __ti13INetTCPSocket After using [c++filt(1)], we know the undefined symbol is the following: INetTCPSocket type_info node ''InetTCPSocket'' is an abstract base class used as in interface. The reason this error was generated was because one function was not declared as abstract, I had forgotten the '= 0' part of the definition. Another symptom of this is the linker complaining "vtable undefined for class ''x''" ---- !!!std::map<>'s crashing I (PerryLorier) was having a problem after assigning something to a std::map<> the program would crash. My (abbreviated) code: __bool__ __operator__ <(__const__ foo_t &a, __const__ foo_t &b) { __if__ (a.foo < b.foo) __return__ -1; __if__ (a.foo > b.foo) __return__ 1; __return__ 0; } std::map<foo_t,__int__*> foo_map; ... foo_map[[foo]=__new__ __int__; *foo_map[[foo]=6; And this code crashed. The reason was that my operator < was wrong. It voilated the contract of a < operator. I changed the "bool operator <" to "int cmp" and then defined operator <: bool operator <(const foo_t &a, const foo_t &b) { return cmp(a,b) < 0; } ''Note that this is a problem with any sorted sequence. Maps are sorted by key. Sets are also sorted. -- SamJansen'' I also recommend adding some assert(3)'s to verify that your operators don't voilate the rules at runtime. ---- !!!Adding one sequence to the end of another in the STL The question sometimes comes up, "How to do I efficiently add one vector to the end of another?". The same applies with lists and so on. This can be done with an ''insertion iterator''. The example below illustrates how to do this: __#include <list>__ __#include <algorithm>__ __int__ main() { std::list<__int__> a; std::list<__int__> b; !a.push_back(1); !a.push_back(2); !a.push_back(3); b.push_back(10); b.push_back(20); b.push_back(30); ''// Copy 'b' to the end of 'a' '' std::copy(b.begin(), b.end(), std::back_insert_iterator< std::list<__int__> >(a)); __return__ 0; } I recommend using __typedef__ to define a type for your STL container types, unlike what I've done in the example above. It is possible to print the list out as follows: std::copy(a.begin(), a.end(), ostream_iterator<int>(cout, " ")); ---- CategoryProgramming
One page links to
C++Notes
:
C++