
auto join = [](const std::vector<std::string>& strings) -> std::string {
std::string joined;
std::for_each( begin(strings), end(strings), [&](const std::string& str) {
joined += str; //+ some delimiter
});
return joined;
};
Forum Index > General Forum |
Thread Rules 1. This is not a "do my homework for me" thread. If you have specific questions, ask, but don't post an assignment or homework problem and expect an exact solution. 2. No recruiting for your cockamamie projects (you won't replace facebook with 3 dudes you found on the internet and $20) 3. If you can't articulate why a language is bad, don't start slinging shit about it. Just remember that nothing is worse than making CSS IE6 compatible. 4. Use [code] tags to format code blocks. | ||
Ethenielle
Norway1006 Posts
August 06 2012 09:40 GMT
#3061
![]() auto join = [](const std::vector<std::string>& strings) -> std::string { std::string joined; std::for_each( begin(strings), end(strings), [&](const std::string& str) { joined += str; //+ some delimiter }); return joined; }; | ||
netherh
United Kingdom333 Posts
August 06 2012 10:52 GMT
#3062
On August 06 2012 14:01 JeanLuc wrote: And basically, if you're so inclined, please bash this code and tell me why its noob (somethign which I intuit it to be). Thanks for any help you can offer. The primary reason your code "is noob", is because you don't use code already written and tested by other people, so that you don't have to roll your own. In C++ this is means using the Standard Library and the Boost libraries. While it's ok to write your own version of things to learn, you'll often find that your best solution will / should approach the already existing standard one. Yours is quite a way off. Firstly, you want to eliminate doing memory management yourself. Never use char* when you can use std::string instead - this is C++, not C. (See Version 1 below). Next, you want to eliminate the error prone passing of the array size. Why not use a standard container instead? (See Version 2 below). Note that we explicitly use a const reference now. The array actually degrades to a pointer, but we don't want to pass a standard container by value. Now that the code is much simpler it's clear there're some cases that haven't been considered. What if the container is empty? Maybe there's a better way of adding the delimiter to cope with the fact that we don't want it appended at the end as well. (See Version 3 below). If there's no better existing solution, and all we need is a function to do this for a specific container and string in our code, it's fine to go this far and stop here. But what if we don't want to pass in a std::vector, but a list / boost::array instead? What if someone's using something other than std::string? Well, that's where templates come in, to allow us to make the function generic (see Version 4). Things have started to get complicated though, and there are more things to worry about, like using insert instead of += (more standard). There are probably better ways to genericise this and detect string / iterator types. By this point we're almost certainly better off using boost. + Show Spoiler +
| ||
netherh
United Kingdom333 Posts
August 06 2012 10:55 GMT
#3063
On August 06 2012 18:40 Ethenielle wrote: You can also save yourself a lot of pain. ![]() auto join = [](const std::vector<std::string>& strings) -> std::string { std::string joined; std::for_each( begin(strings), end(strings), [&](const std::string& str) { joined += str; //+ some delimiter }); return joined; }; Won't this add the delimiter after the last string as well? | ||
Ethenielle
Norway1006 Posts
August 06 2012 11:34 GMT
#3064
| ||
SRBNikola
Serbia191 Posts
August 06 2012 13:26 GMT
#3065
On August 06 2012 19:52 netherh wrote: Show nested quote + On August 06 2012 14:01 JeanLuc wrote: And basically, if you're so inclined, please bash this code and tell me why its noob (somethign which I intuit it to be). Thanks for any help you can offer. The primary reason your code "is noob", is because you don't use code already written and tested by other people, so that you don't have to roll your own. In C++ this is means using the Standard Library and the Boost libraries. While it's ok to write your own version of things to learn, you'll often find that your best solution will / should approach the already existing standard one. Yours is quite a way off. Firstly, you want to eliminate doing memory management yourself. Never use char* when you can use std::string instead - this is C++, not C. (See Version 1 below). Next, you want to eliminate the error prone passing of the array size. Why not use a standard container instead? (See Version 2 below). Note that we explicitly use a const reference now. The array actually degrades to a pointer, but we don't want to pass a standard container by value. Now that the code is much simpler it's clear there're some cases that haven't been considered. What if the container is empty? Maybe there's a better way of adding the delimiter to cope with the fact that we don't want it appended at the end as well. (See Version 3 below). If there's no better existing solution, and all we need is a function to do this for a specific container and string in our code, it's fine to go this far and stop here. But what if we don't want to pass in a std::vector, but a list / boost::array instead? What if someone's using something other than std::string? Well, that's where templates come in, to allow us to make the function generic (see Version 4). Things have started to get complicated though, and there are more things to worry about, like using insert instead of += (more standard). There are probably better ways to genericise this and detect string / iterator types. By this point we're almost certainly better off using boost. + Show Spoiler +
Many of your arguments are debatable when to use and when not to, for example ALWAYS use string object and never char array is bad argument, just because its C++ there i plenty more things to think about when to use and when not to. | ||
heishe
Germany2284 Posts
August 06 2012 13:44 GMT
#3066
On August 06 2012 22:26 SRBNikola wrote: Show nested quote + On August 06 2012 19:52 netherh wrote: On August 06 2012 14:01 JeanLuc wrote: And basically, if you're so inclined, please bash this code and tell me why its noob (somethign which I intuit it to be). Thanks for any help you can offer. The primary reason your code "is noob", is because you don't use code already written and tested by other people, so that you don't have to roll your own. In C++ this is means using the Standard Library and the Boost libraries. While it's ok to write your own version of things to learn, you'll often find that your best solution will / should approach the already existing standard one. Yours is quite a way off. Firstly, you want to eliminate doing memory management yourself. Never use char* when you can use std::string instead - this is C++, not C. (See Version 1 below). Next, you want to eliminate the error prone passing of the array size. Why not use a standard container instead? (See Version 2 below). Note that we explicitly use a const reference now. The array actually degrades to a pointer, but we don't want to pass a standard container by value. Now that the code is much simpler it's clear there're some cases that haven't been considered. What if the container is empty? Maybe there's a better way of adding the delimiter to cope with the fact that we don't want it appended at the end as well. (See Version 3 below). If there's no better existing solution, and all we need is a function to do this for a specific container and string in our code, it's fine to go this far and stop here. But what if we don't want to pass in a std::vector, but a list / boost::array instead? What if someone's using something other than std::string? Well, that's where templates come in, to allow us to make the function generic (see Version 4). Things have started to get complicated though, and there are more things to worry about, like using insert instead of += (more standard). There are probably better ways to genericise this and detect string / iterator types. By this point we're almost certainly better off using boost. + Show Spoiler +
Many of your arguments are debatable when to use and when not to, for example ALWAYS use string object and never char array is bad argument, just because its C++ there i plenty more things to think about when to use and when not to. While the word "always" makes his statement a generalization, his advice is still good, since using std::string over char*, or std::vector<T> over T* and unsigned int size, etc. should be the standard choice in the large majority of cases. In fact, it's very unlikely that you're ever going to be in a situation where you really need char* or T*. And don't start talking about performance critical applications: First of all, these containers are so well optimized by the library writers and also compilers that everything a pure array will give you over the container is more code and no speed-up. Second, performance increases aren't hidden in these kinds of places, but rather in places like (besides algorithm optimization, of course) cache-friendly memory alignment, vectorization, thread or process parallelism, custom allocators, branch free programming etc. So you'd be very hard pressed to find real-world examples where char* is actually to be preferred over std::string. On boost, though: I avoid it like the plague, when I can. Everything in there bloats compile time and binary size like a motherfucker. Sometimes you can't really, though, since boost contains some excellent libraries (filesystem, or python, for example). On August 06 2012 18:40 Ethenielle wrote: You can also save yourself a lot of pain. ![]() auto join = [](const std::vector<std::string>& strings) -> std::string { std::string joined; std::for_each( begin(strings), end(strings), [&](const std::string& str) { joined += str; //+ some delimiter }); return joined; }; If you use a lambda expression, you might as well use built-in for-each as well ![]() auto join = [](const std::vector<std::string>& strings) -> std::string { std::string joined; for(std::string &str : strings) { joined += str; //+ some delimiter }); return joined; }; | ||
Ethenielle
Norway1006 Posts
August 06 2012 16:57 GMT
#3067
| ||
KainiT
Austria392 Posts
August 06 2012 20:45 GMT
#3068
i have the classical "why is the body not from the top to the bottom?-problem" the thing is all those css "solutions" like body,html{height:100%;} don't work, here's my example page: http://www.unet.univie.ac.at/~a1101537/ as you can see(with firebug etc, guess I don't have to explain this to the people that can help me^^) the body begins 60px below the top because appearantly it is affected by the div#kopfbereich css container which should be 60 px from the top... So what do I need to do in order to have a body that actually is 100%? Im obviously a html/css noob, any help much appreciated | ||
JeanLuc
Canada377 Posts
August 06 2012 20:56 GMT
#3069
On August 06 2012 19:52 netherh wrote: Show nested quote + On August 06 2012 14:01 JeanLuc wrote: And basically, if you're so inclined, please bash this code and tell me why its noob (somethign which I intuit it to be). Thanks for any help you can offer. The primary reason your code "is noob", is because you don't use code already written and tested by other people, so that you don't have to roll your own. In C++ this is means using the Standard Library and the Boost libraries. While it's ok to write your own version of things to learn, you'll often find that your best solution will / should approach the already existing standard one. Yours is quite a way off. Firstly, you want to eliminate doing memory management yourself. Never use char* when you can use std::string instead - this is C++, not C. (See Version 1 below). Next, you want to eliminate the error prone passing of the array size. Why not use a standard container instead? (See Version 2 below). Note that we explicitly use a const reference now. The array actually degrades to a pointer, but we don't want to pass a standard container by value. Now that the code is much simpler it's clear there're some cases that haven't been considered. What if the container is empty? Maybe there's a better way of adding the delimiter to cope with the fact that we don't want it appended at the end as well. (See Version 3 below). If there's no better existing solution, and all we need is a function to do this for a specific container and string in our code, it's fine to go this far and stop here. But what if we don't want to pass in a std::vector, but a list / boost::array instead? What if someone's using something other than std::string? Well, that's where templates come in, to allow us to make the function generic (see Version 4). Things have started to get complicated though, and there are more things to worry about, like using insert instead of += (more standard). There are probably better ways to genericise this and detect string / iterator types. By this point we're almost certainly better off using boost. + Show Spoiler +
Much thanks for your input, and these examples. This will give me a lot to think about/pursue. | ||
waxypants
United States479 Posts
August 06 2012 21:15 GMT
#3070
On August 06 2012 18:12 Abductedonut wrote: Show nested quote + On August 06 2012 14:01 JeanLuc wrote: Hi guys, I was hoping people who are studying C/C++ could help me with this. I have come back to C++ from a long sojourn learning "easier" languages such as Java, C#. My understanding of C++ was never that great, but I find myself confused about a lot of stuff. In this bit of code I tried writing a version of the common join() function you see in a lot of languages: basically, you give an array of strings to join() and it returns a string of the concatenated elements separated by a delimiter. What I have here seems to work but I have a bunch of questions to ask: + Show Spoiler + //join.cpp #include "join.h" #include <iostream> #include <cstring> using namespace std; int main(){ char * arr[]={"Yo","Adrian!","I","Did","It!","said","Rocky"}; char delimiter=','; const char * phrase=join(arr,delimiter,sizeof(arr)/sizeof(char *)); cout<<phrase<<endl; if(phrase!=NULL) delete [] phrase; } const char * join(char * arr[], char delimiter, int words){ char * str; int len=0; int a=0; for(int i=0; i<words; i++){ len+=strlen(arr[i])+1; } str=new char[len]; for(int i=0; i<words; i++){ for(int j=0; j<strlen(arr[i]); j++){ str[a++]=arr[i][j]; } if(i<(words-1)) str[a++]=delimiter; } str[a]='\0'; return str; } One thing I'm curious about is.. whether the memory allocation/deallocation in this is handled OKAY. Is there a way to determine the length of the array of char pointers within the function so I don't need to pass that as a parameter? Is it necessary that the function return a const char *? And basically, if you're so inclined, please bash this code and tell me why its noob (somethign which I intuit it to be). Thanks for any help you can offer. Here's something to bash your code. Declaring arr as: char *arr[]= {"Yo","Adrian!","I","Did","It!","said","Rocky",NULL}; Leads to a NULL pointer dereference which could potentially allow a hacker to control flow of execution in your program by Mapping address 0 to a pointer that points to a function of his choice. Alternatively, it can be used to crash your program. Not very good if it's a anti-virus ![]() Happy Programming! Whatchu talking about? He's not executing code pointed to by any of those pointers, just reading and copying data. If you somehow have NULL mapped to something, it will just treat whatever its pointing to as a string of bytes. Anyway if a hacker is able to remap your memory and change your page tables, then I think that the exploitability of this function is the least of your concerns. Actually to address the question of array length, you could actually NULL terminate the array (as shown above) and calculate the length by searching for the NULL pointer. Thats how glib does it. | ||
waxypants
United States479 Posts
August 06 2012 21:18 GMT
#3071
On August 06 2012 18:40 Ethenielle wrote: You can also save yourself a lot of pain. ![]() auto join = [](const std::vector<std::string>& strings) -> std::string { std::string joined; std::for_each( begin(strings), end(strings), [&](const std::string& str) { joined += str; //+ some delimiter }); return joined; }; God damn this is why I hate C++. The ugliest syntax Ive seen. C ftw | ||
Abductedonut
United States324 Posts
August 06 2012 23:17 GMT
#3072
On August 07 2012 06:18 waxypants wrote: Show nested quote + On August 06 2012 18:40 Ethenielle wrote: You can also save yourself a lot of pain. ![]() auto join = [](const std::vector<std::string>& strings) -> std::string { std::string joined; std::for_each( begin(strings), end(strings), [&](const std::string& str) { joined += str; //+ some delimiter }); return joined; }; God damn this is why I hate C++. The ugliest syntax Ive seen. C ftw Yeah, C++ is terrible. That looks like complete trash. | ||
![]()
tofucake
Hyrule18982 Posts
August 06 2012 23:36 GMT
#3073
| ||
Ethenielle
Norway1006 Posts
August 06 2012 23:51 GMT
#3074
Syntax arguments and opinions. God save us all. I might as well chime in. BLAH BLAH C BLAH RAW POINTER ARITHMETIC BLAH BLAH URGH. | ||
![]()
tofucake
Hyrule18982 Posts
August 06 2012 23:54 GMT
#3075
| ||
EscPlan9
United States2777 Posts
August 07 2012 05:46 GMT
#3076
http://www.amazon.com/Building-Android-Apps-HTML-JavaScript/dp/1449316417/ref=wl_it_dp_o_pC_nS_nC?ie=UTF8&coliid=IOUCW0NYIJPFL&colid=WVLO8POCVYWQ If possible, in the process of learning Mobile App/Web dev and Social Networking APIs I'd like to solidify my web development skills using HTML, CSS, Javascript, and jQuery mostly. That's a big part about why I think I might like that book. Thanks for any suggestions! edit: A little background on my current skills. I'm most experienced with programming in C#, and have mild experience with C++, Java, VBScript, Perl, batch processing, CSS, and HTML. | ||
ShoCkeyy
7815 Posts
August 08 2012 02:13 GMT
#3077
| ||
weishime
65 Posts
August 08 2012 04:35 GMT
#3078
On August 08 2012 11:13 ShoCkeyy wrote: Anybody know anything about parallax scrolling and setting heights to certain "pages"? If you mean web, yeah. There are a few libraries for that. A nice one is Stellar.js. | ||
DanceSC
United States751 Posts
August 08 2012 06:20 GMT
#3079
On August 07 2012 14:46 EscPlan9 wrote: I notice many employers looking for people who have experience with Mobile App Development, Mobile Web Development, or Social Networking APIs. I have none of those. Any recommendations for books or sites to get myself into learning and practicing the fundamentals and eventually making my own? I skimmed through a book called Building Android Adds using HTML, CSS and Javascript by Starks and it seemed like it might be good? http://www.amazon.com/Building-Android-Apps-HTML-JavaScript/dp/1449316417/ref=wl_it_dp_o_pC_nS_nC?ie=UTF8&coliid=IOUCW0NYIJPFL&colid=WVLO8POCVYWQ If possible, in the process of learning Mobile App/Web dev and Social Networking APIs I'd like to solidify my web development skills using HTML, CSS, Javascript, and jQuery mostly. That's a big part about why I think I might like that book. Thanks for any suggestions! edit: A little background on my current skills. I'm most experienced with programming in C#, and have mild experience with C++, Java, VBScript, Perl, batch processing, CSS, and HTML. android aps are mostly done in java, you will want to download eclipse, im very certain it is free software. for html / css / javascript check out w3schools.com i use to go there for php. java on the other hand... that one is difficult, any troubles you run into will most likely lead you to vogella for tutorials or stack overflow. imo very difficult to find what you are looking for and trouble shooting is a bitch TT Edit: I should say debugging is a bitch, the try / catches are annoying when you forget them, the null points, and ofc the cannot run on main thread > assync tasks. | ||
![]()
tofucake
Hyrule18982 Posts
August 08 2012 12:17 GMT
#3080
don't use it | ||
| ||
![]() StarCraft 2 StarCraft: Brood War Dota 2 League of Legends Counter-Strike Super Smash Bros Heroes of the Storm Other Games Organizations
StarCraft 2 • Berry_CruncH293 StarCraft: Brood War• practicex ![]() • Light_VIP ![]() • AfreecaTV YouTube • intothetv ![]() • Kozan • IndyKCrew ![]() • LaughNgamezSOOP • Migwel ![]() • sooper7s League of Legends |
Wardi Open
Monday Night Weeklies
PiGosaur Monday
Code For Giants Cup
HupCup
Tenacious Turtle Tussle
The PondCast
SOOP
Dark vs MaxPax
PiG Sty Festival
Serral vs MaxPax
ByuN vs Clem
PiG Sty Festival
herO vs Zoun
Classic vs SHIN
[ Show More ] [BSL 2025] Weekly
PiG Sty Festival
Sparkling Tuna Cup
|
|