# Concatenate

Discussion in 'C++' started by PerritoPerron, Jul 4, 2003.

1. ### PerritoPerronGuest

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

PerritoPerron, Jul 4, 2003

2. ### Jakob BielingGuest

"PerritoPerron" <> wrote in message
news:...
> 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)

Jakob Bieling, Jul 4, 2003

3. ### BruceGuest

In comp.lang.c++
(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....

Bruce, Jul 4, 2003
4. ### Mario ContrerasGuest

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

// 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, Jul 4, 2003
5. ### John HarrisonGuest

"Mario Contreras" <> wrote in message
news:nXkNa.41040\$...
> 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 << ' ';
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

John Harrison, Jul 4, 2003
6. ### John HarrisonGuest

> 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

John Harrison, Jul 4, 2003
7. ### Chris \( Val \)Guest

"Jakob Bieling" <> wrote in message
news:be4kkv\$obk\$07\$-online.com...
| "PerritoPerron" <> wrote in message
| news:...
| > 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 \), Jul 5, 2003
8. ### Jakob BielingGuest

"Chris ( Val )" <> wrote

> "Jakob Bieling" <> 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)

Jakob Bieling, Jul 5, 2003
9. ### BruceGuest

In comp.lang.c++
"Chris \( Val \)" <> 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."

Bruce, Jul 5, 2003
10. ### Stuart GolodetzGuest

"PerritoPerron" <> wrote in message
news:...
> 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:stream_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.

Stuart Golodetz, Jul 5, 2003