| | |
C and C++ Timesaving Tips
Please support our C++ advertiser: Intel Parallel Studio Home
![]() |
Post your tips for making life easier in C and C++. I'll start:
Standard vector object initialization
The biggest problem with the standard vector class is that one can't use an array initializer. This forces us to do something like this:
Anyone who's had the rule of redundancy pounded into their head knows that the previous code could be wrapped in a loop:
However, it's not terribly elegant, especially for a vector of complex types. So, Narue's first timesaving tip for C++ is to use a temporary array so that you can make use of an initializer. Because the vector class defines a constructor that takes a range of iterators, you can use the array to initialize your vector:
Standard vector object initialization
The biggest problem with the standard vector class is that one can't use an array initializer. This forces us to do something like this:
C++ Syntax (Toggle Plain Text)
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); // Use the vector }
C++ Syntax (Toggle Plain Text)
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v; for (int i = 1; i < 6; i++) v.push_back(i); // Use the vector }
C++ Syntax (Toggle Plain Text)
#include <iostream> #include <vector> using namespace std; int main() { int a[] = {1,2,3,4,5}; vector<int> v(a, a + 5); // Use the vector }
I'm here to prove you wrong.
One of my favorite discoveries in C++ regards displaying such a list.
Initially one might do this. Or perhaps even this. But I happend upon the following that can make things even easier. The output for all of these is merely this.
Initially one might do this.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int a[] = {1,2,3,4,5};
vector<int> v(a, a + 5);
for (int i = 0; i < 5; ++i)
{
cout << v[i] << endl;
}
}#include <iostream> #include <vector> #include <iterator> using namespace std; int main() { int a[] = {1,2,3,4,5}; vector<int> v(a, a + 5); vector<int>::const_iterator it, end = v.end(); for (it = v.begin(); it != end; ++it) { cout << *it << endl; } }
#include <iostream> #include <vector> #include <iterator> #include <algorithm> using namespace std; int main() { int a[] = {1,2,3,4,5}; vector<int> v(a, a + 5); copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\n")); }
•
•
•
•
1
2
3
4
5
Last edited by Dave Sinkula; Oct 14th, 2005 at 1:23 pm. Reason: Fixed iterator loop condition -- thanks Micko.
"One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
How to remove duplicate elements from a vector ...
[php]
// load a vector with an integer array and remove duplicates
...
int b[] = {0, 1, 2, 3, 4, 3, 4, 5, 6, 4};
// load using (array, array + NumberOfElements)
vector<int> iV4(b, b + sizeof(b)/sizeof(int));
// remove the duplicates with sort(), erase() and unique()
cout << "removed the duplicate elements:\n";
sort( iV4.begin(), iV4.end() );
iV4.erase( unique( iV4.begin(), iV4.end() ), iV4.end() );
// show the result
for(k = 0; k < iV4.size(); k++)
{
cout << setw(8) << iV4[k];
}
cout << endl;
...
[/php]
[php]
// load a vector with an integer array and remove duplicates
...
int b[] = {0, 1, 2, 3, 4, 3, 4, 5, 6, 4};
// load using (array, array + NumberOfElements)
vector<int> iV4(b, b + sizeof(b)/sizeof(int));
// remove the duplicates with sort(), erase() and unique()
cout << "removed the duplicate elements:\n";
sort( iV4.begin(), iV4.end() );
iV4.erase( unique( iV4.begin(), iV4.end() ), iV4.end() );
// show the result
for(k = 0; k < iV4.size(); k++)
{
cout << setw(8) << iV4[k];
}
cout << endl;
...
[/php]
May 'the Google' be with you!
Removing a newline in C
The fgets function in C is annoying in that it copies a newline character to the buffer:
When you run this program and type "test", this is the output:
This is a good feature for dealing with long lines and such, but for the most part it serves only to frustrate beginners. Experienced programmers have learned to remove the newline with tricks such as:
Or more commonly:
The annoying part of this issue is that one often is required to declare a variable, test for a newline character explicitly, and replace it explicitly. A quick timesaver when writing code is the strcspn function:
The downside to this timesaver is that it doesn't save time during execution. The strcspn trick will usually be slower than most other methods of removing a newline. However, because the performance hit of input far outweighs any difference in speed for removing the newline character.
The fgets function in C is annoying in that it copies a newline character to the buffer:
C++ Syntax (Toggle Plain Text)
#include <stdio.h> int main ( void ) { char buffer[BUFSIZ]; printf ( "Enter a string: " ); if ( fgets ( buffer, sizeof buffer, stdin ) != NULL ) printf ( "|%s|\n", buffer ); return 0; }
C++ Syntax (Toggle Plain Text)
|test |
C++ Syntax (Toggle Plain Text)
#include <stdio.h> #include <string.h> int main ( void ) { char buffer[BUFSIZ]; printf ( "Enter a string: " ); if ( fgets ( buffer, sizeof buffer, stdin ) != NULL ) { size_t len = strlen ( buffer ); if ( buffer[len - 1] == '\n' ) buffer[len - 1] = '\0'; printf ( "|%s|\n", buffer ); } return 0; }
C++ Syntax (Toggle Plain Text)
#include <stdio.h> #include <string.h> int main ( void ) { char buffer[BUFSIZ]; printf ( "Enter a string: " ); if ( fgets ( buffer, sizeof buffer, stdin ) != NULL ) { char *newline = strchr ( buffer, '\n' ); if ( newline != NULL ) *newline = '\0'; printf ( "|%s|\n", buffer ); } return 0; }
C++ Syntax (Toggle Plain Text)
#include <stdio.h> #include <string.h> int main ( void ) { char buffer[BUFSIZ]; printf ( "Enter a string: " ); if ( fgets ( buffer, sizeof buffer, stdin ) != NULL ) { buffer[strcspn ( buffer, "\n" )] = '\0'; printf ( "|%s|\n", buffer ); } return 0; }
I'm here to prove you wrong.
•
•
Join Date: Mar 2005
Posts: 13
Reputation:
Solved Threads: 0
•
•
•
•
Originally Posted by Narue
Removing a newline in C
The fgets function in C is annoying in that it copies a newline character to the buffer:
C++ Syntax (Toggle Plain Text)
char *fget(char *s, int size, FILE * stream) { char *ptr; int c; for (ptr = s; size > 1; --size) { c = getc(stream); if (c == EOF || c == '\n') break; *ptr++ = c; } if (ptr == s) { ptr = NULL; } else { *ptr = 0; } return ptr; }
>i'd just write a new function and get it over with
That's one way to go about it, but since fgets is already there and is presumably written with performance in mind, it's smarter to make use of it:
It's also easier to verify correctness when you use the standard library instead of trying to rewrite it.
That's one way to go about it, but since fgets is already there and is presumably written with performance in mind, it's smarter to make use of it:
C++ Syntax (Toggle Plain Text)
char *reads ( char *s, size_t limit, FILE *stream ) { if ( fgets ( s, limit, stream ) == NULL ) { return NULL; } else { char *newline = strchr ( s, '\n' ); if ( newline != NULL ) *newline = '\0'; return s; } }
I'm here to prove you wrong.
•
•
Join Date: Mar 2005
Posts: 13
Reputation:
Solved Threads: 0
•
•
•
•
Originally Posted by Narue
>i'd just write a new function and get it over with
That's one way to go about it, but since fgets is already there and is presumably written with performance in mind,
•
•
•
•
it's smarter to make use of it:
...
It's also easier to verify correctness when you use the standard library instead of trying to rewrite it.

speaking of weird code, my function should return s and not ptr.
>It's easier to verify correctness when your functions have a single exit point (hint)
That's debatable. Often it's harder in my experience because you have to bend over backward with unnecessary constructs to ensure a single exit point. For trivial functions such as the ones we posted, it's hardly brain surgery to verify correctness. For non-trivial functions, it's difficult to maintain simplicty and still adhere to structured programming "good practice". I prefer to err on the side of simplicity and transparency.
>had in mind when devising the stdio library was performance.
Performance was a primary concern for the design of C and its libraries. As another programmer who's implemented the C89 library in its entirety, I'm not entirely sure what you're referring to. Let me know in PM so we don't end up going too far off topic.
>speaking of weird code, my function should return s and not ptr
Oh good, I thought maybe my mentioning correctness was too subtle of a hint.
That's debatable. Often it's harder in my experience because you have to bend over backward with unnecessary constructs to ensure a single exit point. For trivial functions such as the ones we posted, it's hardly brain surgery to verify correctness. For non-trivial functions, it's difficult to maintain simplicty and still adhere to structured programming "good practice". I prefer to err on the side of simplicity and transparency.
>had in mind when devising the stdio library was performance.
Performance was a primary concern for the design of C and its libraries. As another programmer who's implemented the C89 library in its entirety, I'm not entirely sure what you're referring to. Let me know in PM so we don't end up going too far off topic.
>speaking of weird code, my function should return s and not ptr
Oh good, I thought maybe my mentioning correctness was too subtle of a hint.
I'm here to prove you wrong.
Seeing as this thread is about timesaving what about inheritance? Its a good time saver especially for the masses intent on game creation.
Say you make a class such as
if you wanted to specialise and create objects such as moving platforms / players / weapon models ect you can simply
Without re-coding the entire class. Quite a few people forget inheritance and end up making some really messy classes! Dont forget that pointers are interchangable between derived and base classes which is VERY VERY useful....
An example of this timesaving would be to create a model cass, inherit a weapon class off it, and inherit weapons off the weapon base class. Then also pointers can be moved around the weapons derived classes.... im sure you can work out where this is going! If you look at the Half-Life source they make extensive use of inheritance to make a class oreentated (spelling) source which works very well....
Say you make a class such as
C++ Syntax (Toggle Plain Text)
class CBASE_ENTITY { // code here. this class would provide functions for 'things' that exist in the game };
if you wanted to specialise and create objects such as moving platforms / players / weapon models ect you can simply
C++ Syntax (Toggle Plain Text)
class CBASE_PLAYER : pubic CBASE_ENTITY { // player specific code. };
Without re-coding the entire class. Quite a few people forget inheritance and end up making some really messy classes! Dont forget that pointers are interchangable between derived and base classes which is VERY VERY useful....
An example of this timesaving would be to create a model cass, inherit a weapon class off it, and inherit weapons off the weapon base class. Then also pointers can be moved around the weapons derived classes.... im sure you can work out where this is going! If you look at the Half-Life source they make extensive use of inheritance to make a class oreentated (spelling) source which works very well....
http://sales.carina-e.com
no www
no nonsense
coming soon to a pc near you! :cool:
no www
no nonsense
coming soon to a pc near you! :cool:
![]() |
Similar Threads
- Timesaving Tips (C++)
- Response to time saving tips sticky (C++)
Other Threads in the C++ Forum
- Previous Thread: not sure why program crashes
- Next Thread: helpppppp me with this program
| Thread Tools | Search this Thread |
api array based beginner binary bitmap c++ c/c++ calculator char class classes code coding compile compiler console conversion count database delete deploy desktop developer directshow dll download dynamic dynamiccharacterarray email encryption error file forms fstream function functions game givemetehcodez google graph gui homeworkhelp homeworkhelper iamthwee ifstream int integer java lib linkedlist linker linux list loop looping loops map math matrix memory multiple news node number output parameter pointer problem program programming project python read recursion recursive reference return rpg string strings struct temperature template templates test text text-file tree unix url variable vector visualstudio win32 windows winsock word wordfrequency wxwidgets





