PDA

View Full Version : سوال: کار با آرایه ها



-Geek-
یک شنبه 03 خرداد 1394, 00:45 صبح
سلام دوستان.
لطفا راهنمایی کنید.
یه برنامه داریم که یه ورودی داره.
یه آرایه داریم که 3 ورودی رو توش ذخیره میکنیم.
مثلا:
ab
a
cd

خوب حالا این برنامه باید روی هر کدوم از آرایه ها عملیاتی انجام بده. اینکه مثلا خانه اول رو با خانه دوم و سوم مقایسه کنه و ببینه کدوم حروف توی خانه های دیگه هستن ولی توی خانه اول نیستن و اون حروف به خانه اول اضافه بشن و این کار برای خانه های دوم و سوم هم انجام بشه.

من با توابع خاصی میتونم این عملیات رو روی آرایه ها انجام بدم ؟ یا باید خودم یک تابع براش بنویسم ؟
اگه آموزشی منبعی چیزی در این مورد سراغ داشتید معرفی کنید.
ممنون

rahnema1
یک شنبه 03 خرداد 1394, 07:24 صبح
سلام
به این شکل می تونید انجام بدید

#include <iostream>
#include <vector>
#include <set>
int main()
{
std::vector<std::string> words = {"ab" , "a" , "cd"};
std::set<char> whole_dic;
std::vector<std::set<char>> each_word_dic;
for (auto& word : words)
{
whole_dic.insert(word.begin(), word.end());
each_word_dic.push_back(std::set<char>(word.begin(), word.end()));
}
for (int i = 0; i < words.size(); i++)
{
for(auto& character : whole_dic)
{
if(each_word_dic[i].insert(character).second == true)
words[i] += character;
}
}
for (auto& word : words)
std::cout << word << std::endl;
}

-Geek-
یک شنبه 03 خرداد 1394, 20:51 عصر
خیلی ممنون بابت جواب.
میشه خط هایی که بالاشون کامنت گذاشتم رو یه توضیح کوچیک بدید ؟ برای هر کدومشون گفتم که با کجا مشکل دارم





#include <iostream>
#include <vector>
#include <set>
using namespace std;

int main()
{
vector<string> words = {"ab" , "a" , "cd"};
set<char> whole_dic;
vector<set<char>> each_word_dic;
// What auto& do ???
for (auto& word : words)
{
whole_dic.insert(word.begin(), word.end());
// What happens within push_back() parentheses ??? I mean set<char> what do ???
each_word_dic.push_back(set<char>(word.begin( ), word.end()));
}
for (int i = 0; i < words.size(); i++)
{
for(auto& character : whole_dic)
{
// And please explain what .second keyword is ??
if(each_word_dic[i].insert(character).second == true)
words[i] += character;
}
}
for (auto& word : words)
cout << word << endl;
}

rahnema1
یک شنبه 03 خرداد 1394, 21:12 عصر
با auto میتونیم یک متغیر را استفاده کنیم بدون اینکه نوع اون را بدونیم مثل var در جاوااسکریپت یا سی شارپ
whole_dic دیکشنری از تمام حروف یکتای استفاده شده در کلمات ما هست
each_word_dic هم لیستی از دیکشنری ها هست که به ازای هر کلمه یک دیکشنری داریم که هر دیکشنری شامل حروف یکتای استفاده شده در اون کلمه هست که با push_back می تونیم حروف یکتای موجود در یک کلمه را بدست آوره و داخل دیکشنری مرتبط به اون کنیم. این دیکشنری با set ساخته می شه
چون در دیشکنری یا set خاصیتی وجود داره که با صرف زمان کم با دادن یک حرف بتونیم تشخیص بدیم حرف مورد نظر در دیکشنری هست یا نه یا اگه خواستیم اون حرف را وارد دیکشنری کنیم اگه حرف مورد نظر موجود بود دیگه اون حرف داخل دیکشنری Insert نمیشه به خاطر همین حروف موجود در دیکشنری یکتا هستند
second هم اگه true باشه نشون میده حرفی که می خواستیم Insert کنیم، داخل دیشکنری بوده یا نه

-Geek-
دوشنبه 04 خرداد 1394, 17:23 عصر
خیلی ممنون از جوابتون.
یک سوال دیگه.
اینکه اگه بخوایم بعدا خروجی این کد رو مرتب کنیم میتونیم از تابع خاصی برای اینکار استفاده کنیم ؟
منظورم اینه که مثلا ما cd رو به عنوان ورودی دادیم. و بعدش که برنامه خروجی رو میده به این شکل میشه : cdab

rahnema1
دوشنبه 04 خرداد 1394, 17:29 عصر
متوجه نشدم الا اون سه ورودی {"ab" , "a" , "cd"} که دادیم به ترتیب چه خروجی باید بده؟

-Geek-
دوشنبه 04 خرداد 1394, 17:38 عصر
Enter the bool 1:
a^b
Enter the bool 2:
a
Enter the bool 3:
cd
abcd abcd cdab

rahnema1
دوشنبه 04 خرداد 1394, 17:41 عصر
الان هم که همین خروجی را میده!

-Geek-
دوشنبه 04 خرداد 1394, 17:54 عصر
خروجی درسته و مشکلی نداره.
ولی من برای آیتم سوم که همون cdab هست ، میخوام که بر اساس حروف الفبا ترتیب بندی بشه. البته همه ی آیتم هایی که مرتب نبودن ، مرتب بشن

rahnema1
دوشنبه 04 خرداد 1394, 18:00 عصر
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
int main()
{
std::vector<std::string> words = {"ab" , "a" , "cd"};
std::set<char> whole_dic;
std::vector<std::set<char>> each_word_dic;
for (auto& word : words)
{
whole_dic.insert(word.begin(), word.end());
each_word_dic.push_back(std::set<char>(word.begin(), word.end()));
}
for (int i = 0; i < words.size(); i++)
{
for(auto& character : whole_dic)
{
if(each_word_dic[i].insert(character).second == true)
words[i] += character;
}
}
for (auto& word : words)
{
std::sort(word.begin(), word.end());
std::cout << word << std::endl;
}
}

-Geek-
دوشنبه 04 خرداد 1394, 18:11 عصر
پس از تابع sort استفاده میکنیم.
باز هم ممنون ازتون