471,078 Members | 831 Online

# Concatenate

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..

Thanks...
Jul 19 '05 #1
9 8738
"PerritoPerron" <ma******@ev1.net> wrote in message
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)
Jul 19 '05 #2
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);
}
Jul 19 '05 #3

"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)
}
{
// 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
Jul 19 '05 #4
> 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)
}
{
// 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
Jul 19 '05 #5

"Jakob Bieling" <ne*****@gmy.net> wrote in message
news:be*************@news.t-online.com...
| "PerritoPerron" <ma******@ev1.net> wrote in message
| > 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

Jul 19 '05 #6
"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)
Jul 19 '05 #7
"PerritoPerron" <ma******@ev1.net> wrote in message
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..

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;
}

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.
Jul 19 '05 #8
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....
Jul 19 '05 #9
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."
Jul 19 '05 #10

### This discussion thread is closed

Replies have been disabled for this discussion.