Concatenate

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

  1. 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...
    PerritoPerron, Jul 4, 2003
    #1
    1. Advertising

  2. "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
    #2
    1. Advertising

  3. PerritoPerron

    Bruce Guest

    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
    #3
  4. 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
    #4
  5. "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)
    }
    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 << ' ';
    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
    #5
  6. > 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
    John Harrison, Jul 4, 2003
    #6
  7. "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
    #7
  8. "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
    #8
  9. PerritoPerron

    Bruce Guest

    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
    #9
  10. "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..
    >
    > 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::eek:stream_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.
    Stuart Golodetz, Jul 5, 2003
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Mike James
    Replies:
    1
    Views:
    1,830
    Jim Gibson
    Sep 19, 2003
  2. Luis E Valencia

    Concatenate Hyperlink with databinder

    Luis E Valencia, May 27, 2004, in forum: ASP .Net
    Replies:
    0
    Views:
    1,698
    Luis E Valencia
    May 27, 2004
  3. =?Utf-8?B?TWlrZSBNb29yZQ==?=

    Concatenate

    =?Utf-8?B?TWlrZSBNb29yZQ==?=, Nov 24, 2004, in forum: ASP .Net
    Replies:
    3
    Views:
    4,214
    Mark Rae
    Nov 24, 2004
  4. Luis Esteban Valencia

    Concatenate datalist variables with javascript and html

    Luis Esteban Valencia, Jan 20, 2005, in forum: ASP .Net
    Replies:
    0
    Views:
    2,624
    Luis Esteban Valencia
    Jan 20, 2005
  5. Carlos

    Concatenate/De-Concatenate

    Carlos, Oct 12, 2012, in forum: VHDL
    Replies:
    10
    Views:
    881
Loading...

Share This Page