TransWikia.com

C++ Builder 6. Как удалить последние два элемента строки?

Stack Overflow на русском Asked by Alexander Stepanov on February 16, 2021

Всем привет!
Моя задача: организовать объединение множеств(объединить элементы двух множеств,при этом чтобы все они были в единственном экземпляре).
у меня есть 4 компоненты:
3 Edit;
1 Button.
При нажатии на Button будет выполняться код, написанный ниже. Вкратце об алгоритме работы: информацию, записанную в первые два Edit-а (числа), перевожу в строчный тип данных, записываю элементы множества 1, а затем элементы множества 2, при этом каждый элемент множества 2 сравниваю с каждым элементом множества 1, если он будет равен хоть 1 из элементов множества 1, то он стирает записанный элемент, чтобы избежать повторов (это последняя строка кода, я не знаю, как это прописать, поэтому я хочу у Вас спросить, как из этой строки: Edit3->Text = Edit3->Text + IntToStr((int)b[w]); сделать строку, которая будет удалять повторяющийся элемент.

int i,j,l,tmp, a[50],b[50], s = 0, k = 0;

AnsiString str=Edit1->Text; 
str=str+" "; 
l=str.Length(); 
for(i=1;i<=l;i++){ 
  j = str.Pos(' ')-1; 
  a[i-1]=StrToInt(str.SubString(1,j)); 
  str.Delete(1,j+1);
  l-=j;
  k=i-1;

AnsiString str1=Edit2->Text;
str1=str1+" ";
l=str1.Length();
for(i=1;i<=l;i++){
  j = str1.Pos(' ')-1;
  b[i-1]=StrToInt(str1.SubString(1,j));
  str1.Delete(1,j+1);
  l-=j;
  s=i-1;

 for (int i = 0; i <= k; i++){
    Edit3->Text = Edit3->Text + IntToStr((int)a[i])+ " ";}
    for(int w=0;w<=s;w++){
    Edit3->Text = Edit3->Text + IntToStr((int)b[w]) + " ";
    for (int i = 0; i <= k; i++){
    if(b[w] == a[i]){
    Edit3->Text = Edit3->Text + IntToStr((int)b[w]);} } }

One Answer

Не совсем понятно что вы пытались сделать, но если вам нужно добавить в строку только те элементы из второй строки, каких нет в первой, то это можно делать так:

std::string&
merge_unique(std::string& str1, const std::string str2)
{
    std::map<char, int> m;
    for (char c : str1)
        m[c]++;
    for (char c : str2)
        if (!m[c]){
            str1 += c;
            m[c]++;
        }
    return str1;
}

В строковом обьекте, которую вы передадите как первый аргумент функции, будет содержаться нужная вам строка.

А если вы хотели делать что то похожее, но не так, то используйте идею.

ОБНОВЛЕНИЕ по просьбе автора вопроса: немного о конструкции for (char c : str1) если коротко, то это равносильно, еслибы я записал

int l = str1.length();    
for (int i = 0; i < l; ++i) {  
    char c = str1[i]; 
    m[c]++;        
}

map, это ассоциативный контейнер из стандартной библиотеки. Ассоциативные контейнеры обеспечивают быстрый поиск данных, основанных на ключах. Контейнер содержит пары ключ/значение... В данном примере, если в m нет пары с ключом с, то m[c] возвращает значение по умолчанию(для обьектов типа int это ноль). Можно написать и без использования ассоциативного контейнера, но код получится длиннее...

Answered by AR Hovsepyan on February 16, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP