STL under LINUX compile problems

3 отговора 155 прегледа
#1

STL under LINUX compile problems

Zdraveite, moje li njakoi da mi pomogne? Stava vapros za C++ STL kod koito ne se kompilira pod Linux. Vsichko napisano se kompilira i linkva pod windows i si varvi chudesno. No celta e da se podkara (izkompilira i linkne) pod linux. Po dolu paste-vam malyk primer na tova koeto po princip pravi problem. Kogato se opitam da napravia std::for_each() ili std::translate() kompilatora kazva che ne mojel da si konvertira tipovete koito mu se podavat za primera po-dolu ne moje da konvertira basic_string kym string. Ako ima njakoi da mi obiasni v kakvo tochno se sastoia problema i kak moje da byde razreshen molia da pishe ili moje da mi pishe na ICQ:76042513.

#pragma warning(disable:4786)
#include <iostream>
#include <set>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct ltstr
{
bool operator()(std::string s1, std::string s2) const
{
return s1 < s2;
}
};

//TYPEDEFS
typedef std::set<std::string, ltstr> StringSet;
typedef std::vector<std::string> StringVector;

void PrintUsage1(char *progname)
{
cerr << "usage: " << progname << " <dictionary name> <file 1> [<file 2> ...]" << endl;
exit(1);
}

char * strProgramName = "spell-check";

template<class T> struct copy_word : public std::unary_function<T, void>
{
copy_word(StringVector & _copyTo) : copyTo(_copyTo) {};

void operator() (T & x)
{
copyTo.push_back(x);
}
StringVector & copyTo;
};

void CopyTo(StringSet & from, StringVector & to)
{
//ako razkomentiram dolnia red se piaviavat problemite
//std::for_each(from.begin(), from.end(), copy_word<std::string>(to));
}

int main(int argc, char * argv[])
{
StringSet sDict;
sDict.insert("grozdan");
sDict.insert("danko");
sDict.insert("asen");
StringVector vDict;
CopyTo(sDict, vDict);

for(StringVector::iterator it = vDict.begin(); it != vDict.end(); ++it)
{
cout << it->c_str()<<endl;
}
return 0;
}

Отговор
в отговор на Skymaster #2

Re: STL under LINUX compile problems

Shtom tuk si popital, tuk i shte si poluchish otgovora :-)

#include <iostream>
#include <set>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct ltstr
{
bool operator()(std::string s1, std::string s2) const
{
return s1 < s2;
}
};

//TYPEDEFS
typedef std::set<std::string, ltstr> StringSet;
typedef std::vector<std::string> StringVector;

void PrintUsage1(char *progname)
{
cerr << "usage: " << progname << " <dictionary name> <file 1> [<file 2> ...]" << endl;
exit(1);
}

char * strProgramName = "spell-check";

template<class T> struct copy_word : public std::unary_function<T, void>
{
copy_word(StringVector & _copyTo) : copyTo(_copyTo) {};

void operator() (const T & x)
{
copyTo.push_back(x);
}
StringVector & copyTo;
};

void CopyTo(StringSet & from, StringVector & to)
{
//ako razkomentiram dolnia red se piaviavat problemite
std::for_each(from.begin(), from.end(), copy_word<std::string>(to));
}

int main(int argc, char * argv[])
{
StringSet sDict;
sDict.insert("grozdan");
sDict.insert("danko");
sDict.insert("asen");
StringVector vDict;
CopyTo(sDict, vDict);

for(StringVector::iterator it = vDict.begin(); it != vDict.end(); ++it)
{
cout << it->c_str()<<endl;
}
return 0;
}

Редактирано от Potencialen emigrant на

Отговор
в отговор на Skymaster #3

Re: STL under LINUX compile problems

Potencialen emigrant вече е решил задачката Аз само ще добавя, че неща като това тук са ужасно неефективни:

struct ltstr
{
bool operator()(std::string s1, std::string s2) const
{
return s1 < s2;
}
};

Много по-добре е да го замениш с това:

struct ltstr
{
bool operator()(const std::string& s1, const std::string& s2) const
{
return s1 < s2;
}
};

Отговор
в отговор на Pesho® #4

Много си прав

Все пак ако това ще му бъде оператора за сравнение най-добре изобщо да не слага втори аргумент на std::set.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор