Hi there fellas..
I am learning this powerful language, but came accross a concatenation
problem that I can't resolve.
I have 2 arrays
A1[] = {1,2,3,4};
A2[] = {1,3,5,7};
I need to put them together in an int array that looks like this.
A3[32] = {1,2,3,4,5,7};
Sum them both, but skip duplicates..
Can some1 Help Please...
Thanks... 9 8738
"PerritoPerron" <ma******@ev1.net> wrote in message
news:2c**************************@posting.google.c om... Hi there fellas.. I am learning this powerful language, but came accross a concatenation problem that I can't resolve.
I have 2 arrays
A1[] = {1,2,3,4}; A2[] = {1,3,5,7};
I need to put them together in an int array that looks like this. A3[32] = {1,2,3,4,5,7};
Sum them both, but skip duplicates..
Use vectors instead of C-style arrays. Here's some untested snippet:
vector <int> a1, a2, a3;
// fill vectors with your values
a3 = a1; // copy first into a3
a3.insert (a3.end (), a2.begin (), a2.end ()); // append second
sort (a3.begin (), a3.end (), less <int> ()); // sort a3
unique (a3.begin () , a3.end ()); // remove dups
Again, I just typed this into my newsreader without trying to compile
this. But it will give you an idea of how it would work.
hth
--
jb
(replace y with x if you want to reply by e-mail)
This is what I have, but it needs a little modification
It gets all values from 2 arrays, but still not perfect..
// I need to put 2 arrays together in an
// single int array.
// no duplicates
#include <iostream>
using namespace std;
#define L2 << endl << endl
#define L3 << endl << endl << endl << endl
class Set{
public:
void Sum(int a[], int b[], int c[], int size);
}; // End of class
// i Corre a
void Set::Sum(int a[], int b[], int c[], int size){
int tmp = size;
for (int i = 0; i < size; i++){
c[i] = a[i];
}
// Jota corre b
for (int j = 0; j < size; j++){
for (int k = 0; k < size; k++){
if(c[k] != b[j])
c[j+tmp] = b[j];
}
}
// Just to print all c array
for (int z = 0; c[z] != '\0'; z++)
cout << "c[" << z << "] = " << c[z] << endl;
}
void main(){
int size = 4;
int a[] = {1,2,3,4};
int b[] = {1,3,5,7};
int c[32] = {0};
Set s;
s.Sum(a, b, c, size);
}
"Mario Contreras" <ma***@txpos.com> wrote in message
news:nX********************@twister.austin.rr.com. .. This is what I have, but it needs a little modification It gets all values from 2 arrays, but still not perfect..
// I need to put 2 arrays together in an // single int array. // no duplicates
#include <iostream> using namespace std; #define L2 << endl << endl #define L3 << endl << endl << endl << endl
class Set{ public: void Sum(int a[], int b[], int c[], int size); }; // End of class
Looks like you are trying to write a Set class but you don't really know how
to design it.
You need to put one of the arrays inside the Set class, otherwise it's a
waste of time. Then you need to add some useful member functions to the Set
class.
Start like this
// set, maximum size 32
class Set
{
public:
Set()
{
// make empty set
}
Set(int a[], int size)
{
// make set from array (remove duplicates)
}
void add_int(int val)
{
// add one int to array (if not duplicate)
}
void union(const Set& x)
{
// add another Set to this Set (remove duplicates)
}
void print()
{
for (int i = 0; i < size; ++i)
cout << elem[i] << ' ';
cout << '\n';
}
private:
int elem[32]; // can't have more than 32 integers
int size; // how many integers we have got
};
Then do this
int main()
{
int a[] = {1,2,3,4};
int b[] = {1,3,5,7};
Set a_set(a, 4);
Set b_set(b, 4);
Set c_set = a_set; // copy a_set to c_set
c_set.union(b_set); // add b_set to c_set
c_set.print();
}
All you have to do is write the member functions above.
john
> Start like this // set, maximum size 32 class Set { public: Set() { // make empty set } Set(int a[], int size) { // make set from array (remove duplicates) } void add_int(int val) { // add one int to array (if not duplicate) } void union(const Set& x) { // add another Set to this Set (remove duplicates) }
Of course you can't have a member function called union, change union to
make_union, or something.
john
"Jakob Bieling" <ne*****@gmy.net> wrote in message
news:be*************@news.t-online.com...
| "PerritoPerron" <ma******@ev1.net> wrote in message
| news:2c**************************@posting.google.c om...
| > Hi there fellas..
| > I am learning this powerful language, but came accross a concatenation
| > problem that I can't resolve.
| >
| > I have 2 arrays
| >
| > A1[] = {1,2,3,4};
| > A2[] = {1,3,5,7};
| >
| > I need to put them together in an int array that looks like this.
| > A3[32] = {1,2,3,4,5,7};
| >
| > Sum them both, but skip duplicates..
|
|
| Use vectors instead of C-style arrays. Here's some untested snippet:
|
| vector <int> a1, a2, a3;
| // fill vectors with your values
|
| a3 = a1; // copy first into a3
| a3.insert (a3.end (), a2.begin (), a2.end ()); // append second
| sort (a3.begin (), a3.end (), less <int> ()); // sort a3
| unique (a3.begin () , a3.end ()); // remove dups
[snip]
Its not that big a deal in this case I suppose, but
'std::unique()' will *not remove all duplicates*.
It will only remove *consecutive* duplicates.
Cheers.
Chris Val
"Chris ( Val )" <ch******@bigpond.com.au> wrote "Jakob Bieling" <ne*****@gmy.net> wrote in message
| sort (a3.begin (), a3.end (), less <int> ()); // sort a3 | unique (a3.begin () , a3.end ()); // remove dups
Its not that big a deal in this case I suppose, but 'std::unique()' will *not remove all duplicates*.
It will only remove *consecutive* duplicates.
Which is why I used std::sort before removing the dups.
regards
--
jb
(replace y with x if you want to reply by e-mail)
"PerritoPerron" <ma******@ev1.net> wrote in message
news:2c**************************@posting.google.c om... Hi there fellas.. I am learning this powerful language, but came accross a concatenation problem that I can't resolve.
I have 2 arrays
A1[] = {1,2,3,4}; A2[] = {1,3,5,7};
I need to put them together in an int array that looks like this. A3[32] = {1,2,3,4,5,7};
Sum them both, but skip duplicates..
Can some1 Help Please... Thanks...
#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vec1(4), vec2(4), vec3;
vec1[0] = 1;
vec1[1] = 2;
vec1[2] = 3;
vec1[3] = 4;
vec2[0] = 1;
vec2[1] = 3;
vec2[2] = 5;
vec2[3] = 7;
vec3.reserve(8); // reserve space for the maximum
possible number of elements necessary
std::set_union(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(),
std::back_inserter<std::vector<int> >(vec3));
vec3.swap(std::vector<int>(vec3)); // shrink-to-fit (if desired)
std::copy(vec3.begin(), vec3.end(),
std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
return 0;
}
There are a number of things to explain about this:
1) std::vector<int> vec1(4) creates a std::vector (a sort of self-managing
array) with current size 4.
2) vec3.reserve(8); does *not* resize the vector, it ensures that the
vector's capacity (distinct from its size) is at least 8. This means that
the memory has been allocated for at least 8 elements, even though the
current number of elements (the size of the vector) is still 0.
3) std::set_union(<blah>) is the bit which does what you want, since what
you want is in fact just a set union operation.
4) std::back_inserter<std::vector<int> >(vec3) is an output iterator which
pushes things onto the end of vec3.
5) vec3.swap(std::vector<int>(vec3)); trims excess capacity from the vector
(a so-called "shrink-to-fit" operation). Although the size of vec3 will be 6
after the set_union, the capacity will still be at least 8. Shrink-to-fit
attempts to make it as small as possible (whilst still greater than 6),
though the exact capacity afterwards depends on the implementation.
6) std::copy(<blah>) outputs the elements of the vector to std::cout, using
an ostream_iterator which separates the elements with a space (" ").
While we're using lots of stuff from the Standard Library, here's a book
recommendation:
The C++ Standard Library (Josuttis)
HTH,
Stuart.
In comp.lang.c++ ma******@ev1.net (PerritoPerron) wrote: I am learning this powerful language, but came accross a concatenation problem that I can't resolve.
I have 2 arrays
A1[] = {1,2,3,4}; A2[] = {1,3,5,7};
I need to put them together in an int array that looks like this. A3[32] = {1,2,3,4,5,7};
Sum them both, but skip duplicates..
You have presented the problem but none of your work at solving it. How do
YOU think you should do it? Perhaps: sort both, add, compare, add,
compare....
In comp.lang.c++
"Chris \( Val \)" <ch******@bigpond.com.au> wrote: | sort (a3.begin (), a3.end (), less <int> ()); // sort a3 | unique (a3.begin () , a3.end ()); // remove dups
[snip]
Its not that big a deal in this case I suppose, but 'std::unique()' will *not remove all duplicates*.
It will only remove *consecutive* duplicates.
Hmmm, you sure about that? If it is sorted first, as it is in his code, it
should remove all dupes.
"Every time a consecutive group of duplicate elements appears in the range
[first, last), the algorithm unique removes all but the first element." This discussion thread is closed Replies have been disabled for this discussion. Similar topics
reply
views
Thread by Nick Heppleston |
last post: by
|
30 posts
views
Thread by priya |
last post: by
|
8 posts
views
Thread by Dixie |
last post: by
|
6 posts
views
Thread by Sheldon |
last post: by
|
14 posts
views
Thread by metamorphiq |
last post: by
|
2 posts
views
Thread by exapplerep |
last post: by
|
4 posts
views
Thread by Dan |
last post: by
|
12 posts
views
Thread by parth |
last post: by
|
13 posts
views
Thread by sinbad |
last post: by
|
10 posts
views
Thread by Aaron Hoffman |
last post: by
| | | | | | | | | | |