Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Намиране на дубликати

Featured Replies

Здравейте, опитвам се напиша функция, която да ми изкара САМО хората с едни и същи имена, но нещо не се получава. Благодаря предварително :) .

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<numeric>
#include<fstream>
#include<iterator>
#include <functional>

using namespace std;

class Tourist
{public:
   string name;
   string country;
   int age;
   string sex;
public:
	Tourist(){}

	Tourist(string n, string c, int a, string s)
	{name=n;
	 country=c;
	 age=a;
	 sex=s;}

	Tourist(const Tourist& t)
	{name=t.name;
	 country=t.country;
	 age=t.age;
	sex=t.sex;}

	void setName(string n)
	{name=n;}

	void setCountry(string c)
	{country=c;}

	void setAge(int a)
	{age=a;}

	void setSex(string s)
	{sex=s;}

	string getName()
	{return name;}

	string getCountry()
	{return country;}

	int getAge()
	{return age;}

	string getSex()
	{return sex;}

	bool operator < (const Tourist& t)
	{return this->name < t.name;}

	bool operator == (const Tourist& t)
	{return this->name == t.name;}

	Tourist& operator = (const Tourist& t)
	{this->age=t.age;
	this->country=t.age;
	this->name=t.name;
	this->sex=t.sex;
	return *this;}

	friend ostream& operator << (ostream& toStream, const Tourist& t);
	friend istream& operator >> (istream& fromStream, Tourist& t);

};
ostream& operator << (ostream& toStream,const Tourist& t)
{toStream<<t.name<<" "<<t.country<<" "<<t.age<<" "<<t.sex<<endl;
return toStream;}

istream& operator >> (istream& fromStream, Tourist& t)
{fromStream>>t.name>>t.country>>t.age>>t.sex;
return fromStream;}

class TurData : public Tourist
{
public:
	string kurort;
public:

	TurData(string n, string c, int a, string s, string k): Tourist(n, c,  a,s)
	{kurort=k;}

	TurData(){}

};
 vector<TurData> tur;
 vector<TurData>:: iterator it;

 void func()
 {sort(tur.begin(),tur.end());
 it=adjacent_find(tur.begin(),tur.end());
 tur.erase(tur.begin(),it);
 for(it=tur.begin();it!=tur.end();it++)
	 cout<<(*it).getName()<<" "<<endl;}

int main()
 {TurData tur1("Zlatina"," Bulgaria", 20, "female", "Slunchev Brqg");
TurData tur2("Maria" ,"Bulgaria" ,18 ,"female" ,"Zlatni pyasatsi");
TurData tur3("Udoji"," Kongo", 33 ,"male", "Albena");
TurData tur4("Mark"," USA", 45 ,"male", "Zlatni pyasatsi");
TurData tur5("Gogo"," Bulgaria", 30 ,"male", "Slunchev brqg");
TurData tur6("Udoji"," Kongo", 43 ,"male", "Albena");
TurData tur7("Mark"," USA", 40 ,"male", "Albena");
TurData tur8("Svilen"," Bulgaria", 21 ,"male", "Slunchev brqg");
tur.push_back(tur1);
tur.push_back(tur2);
tur.push_back(tur3);
tur.push_back(tur4);
tur.push_back(tur5);
tur.push_back(tur6);
tur.push_back(tur7);
tur.push_back(tur8);
  
func();
}

 

Untitled.png

Searches the range [first,last) for the first occurrence of two consecutive elements that match, and returns an iterator to the first of these two elements, or last if no such pair is found.

Пробвай с

tur.erase(it, it + 1);

 

it е върнатата стойност, която според спецификацията е итератор към първото еднакво име от двете адджасънт. Не е tur.begin()

Аз го разбирам, че не се връща първия итератор на вектора, а се връща итератор към първото еднакво име от двете адджасънт намерени

Трябва да търсиш адджасънт еднаквите с цикъл. Ти така си намерил итератора към първата двойка еднакви имена и си изтрил всичко от началото до нея, като нея си я оставил.

За това изтритите имена са първите две по азбучен ред

сортирания вектор е

gogo

maria

mark

mark

svilen

udoji

udoji

zlatina

Като изпълниш адджасънт файнд, ти получаваш "it", който сочи към "mark", което е първото от първата двойка еднакви долепени имена. След това си истрил всички имена от tur.begin() до "it", които се явяват  gogo и maria

Редактирано от Реджеп Иведик (преглед на промените)

vector<TurData> tur;
vector<TurData>:: iterator it;


void func()
 {sort(tur.begin(),tur.end());
 for (;;)
 {
 	it=adjacent_find(tur.begin(),tur.end());
 	if (it == tur.end()) break;
 	tur.erase(it, it + 1);
 }
 for(it=tur.begin();it!=tur.end();it++)
	 cout<<(*it).getName()<<" "<<endl;}

 

Редактирано от Реджеп Иведик (преглед на промените)

  • Автор

Излезе ми грешка "vector iterator not incrementable". Поразгледах в интернет как да се оправи грешката, промених само реда с erase 

it=tur.erase(it, it + 1);

Проблема е, че така написано, резултатът е следния : 

gogo

maria

mark

svilen

udoji

zlatina

а на мен ми трябва да излезе: 

mark

mark

udoji

udoji

 

vector<TurData> tur;
.......................................
......................................
................................................
..................................................
  
  
vector<TurData>:: iterator it;
vector<TurData>:: iterator mit;
vector <TurData> mur;
  
void func()
 {sort(tur.begin(),tur.end());
 mit = tur.begin();
 for (;;)
 {
 	it=adjacent_find(mit,tur.end());
 	if (it == tur.end()) break;
 	mur.push_back(*it);
  	mur.push_back(*(it+1));
  	mit = it + 2;  	
 }
 tur = mur;
 mur.erase(mur.begin(), mur.end());
 for(it=tur.begin();it!=tur.end();it++)
	 cout<<(*it).getName()<<" "<<endl;}

 

Непосредствено преди функцията декларираш празен вектор в който да съхраняваш резултатите, както и два итератора, а не един. Като намериш двойката я добавяш в новия вектор. Накрая заместваш съдържанието на стария вектор със съдържанието на новия и изтриваш новия.

 

Другия вариант е да декларираш новия вектор в програмния стек, като локален за функцията. Тогава няма нужда да ирейзваш съдържанието му, защото деструктора му ще го ирейзне служебно на излизане от функцията. Но така се товари стека и при дълги вектори може да се получи стек оверфлоу.

Редактирано от Реджеп Иведик (преглед на промените)

Ето така работи кат пушка. Може да копираш и да компилираш едно към едно. Разликата е само в типа на данните на вектора, но ти така и така си дефинирал вече оператора "==" за твоя тип, лесно ще си я преправиш.

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector <string> tur = { "gogo", "maria", "mark", "mark", "svilen", "udoji", "udoji", "zlatina" };

vector <string> mur;
vector <string>::iterator it;
vector <string>::iterator mit;

void func()
{
	mit = tur.begin();
	for (;;)
	{
		it = adjacent_find(mit, tur.end());
		if (it == tur.end()) break;
		mur.push_back(*it);
		mur.push_back(*(it + 1));
		mit = it + 2;
	}
	tur = mur;
	mur.erase(mur.begin(), mur.end());
	for (it = tur.begin(); it != tur.end(); it++)
		cout << (*it) << endl;
}


int main()
{
	func();
	return 0;
}

 

Редактирано от Реджеп Иведик (преглед на промените)

А така изкарва не само дублетите, а и тройките и четворките, и въобще всички долепени в сортиран вектор. Трие само посамите.

 


#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector <string> tur = { "gogo", "maria", "mark", "mark", "mark", "mark", 
  		"svilen", "udoji", "udoji", "zlatina" };



void func()
{
	int i;
	int n = tur.size();
	if (tur[0] == tur[1]) tur.push_back(tur[0]);
	for (i = 1; i < n - 1; i++)
	{
		if ((tur[i] == tur[i - 1]) || (tur[i] == tur[i + 1]))
		{
			tur.push_back(tur[i]);
		}
	}
	if (tur[n - 1] == tur[n - 2]) tur.push_back(tur[n - 1]);
	tur.erase(tur.begin(), tur.begin() + n);
	for (i = 0; i < tur.size();i++)
		cout << tur[i] << endl;
}


int main()
{
	func();
	return 0;
}

 

Редактирано от Реджеп Иведик (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    26%
    Дарени 256.00 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.