Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.82
botasa
3 / 3 / 0
Регистрация: 18.01.2011
Сообщений: 131
#1

Позиция элемента в контейнере STL кон. SET, поиск контейнер set словарь позиция - C++

21.04.2012, 20:09. Просмотров 4933. Ответов 31
Метки нет (Все метки)

Есть код №1. Он выводить на экран позицию нужного мне слова (только если в середине 1 слово а не 2 и больше например только "privet". А когда "privet kak dela" - он не хочет работать), которое я ищу в самом контейнере. Каким образом можно сделать такое, только из контейнером set и не 1 слово в середине а несколько, хотя б 3. Позиция данного элемента нужна, что б по позиции вывести нужные мне слова в другом контейнере, того ж типа.
#1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    vector<string> v1;
    v1.push_back("privet");
    v1.push_back("kak");
    v1.push_back("dela");
    string value = "dela";
    vector<int> loc_list;
    vector<string>::iterator location = v1.begin();
    while(1)
    {
        location = find(location, v1.end(), value);
        if(location == v1.end()) break;
        loc_list.push_back(location - v1.begin());
        location++;
    }
    print(loc_list);
#2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    set<string> v1;
    v1.insert("privet, kak, dela");
    v1.insert("xrenovo, delau, kyrsak");
    string value;
        cin >> value;
    vector<int> loc_list;
    set<string>::iterator location = v1.begin();
    while(1)
    {
        location = find(location, v1.end(), value);
        if(location == v1.end()) break;
        loc_list.push_back(location - v1.begin());
        location++;
    }
    print(loc_list);
В теории код №2 должен работать, но не работает. Каким образом можно его исправить.

Или каким другим способом можно это все реализовать ???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2012, 20:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Позиция элемента в контейнере STL кон. SET, поиск контейнер set словарь позиция (C++):

STL, контейнер set - C++
Помогите, пожалуйста. Задание состоит вот в чем: даны названия городов, и для них перечислены города, в которые можно попасть без...

STL контейнер set, вставка элементов - C++
Уважаемые админы.Снова прошу о помощи. Необходимо в множество bred,начиная с позиции n, вставить элементы из множества new_bred. ...

Используя STL контейнер set заполнить массив - C++
Задание 2. Данную задачу решить не используя метод sort, а используя STL контейнер: set. Заполнить массив размером 10 случайными числами от...

Поиск элемента по set - C++
Помогите с поиском элемента в наследуемом set. template&lt;typename _T&gt;class ThreadedSet { public: void unreg(const _T&amp;...

контейнер set - C++
Создать контейнер set, ввести в него 3 числа. Создать метод по вычислении наибольшего из этих чисел помогите, пожалуйста, с заданием или...

Контейнер set - C++
Есть текст на агл. языке. Используя контейнер set нужно упорядочить слова этого текста в алфавитном порядке. Вот то, что я сделал: ...

31
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
22.04.2012, 11:55 #16
А это что тогда за?
Цитата Сообщение от botasa Посмотреть сообщение
Позиция данного элемента нужна, что б по позиции вывести нужные мне слова в другом контейнере, того ж типа.
0
botasa
3 / 3 / 0
Регистрация: 18.01.2011
Сообщений: 131
22.04.2012, 12:08  [ТС] #17
Цитата Сообщение от Deviaphan Посмотреть сообщение
А это что тогда за?
ну я это понимаю как : есть 2 контейнера, я последовательно заливаю слова из файла в оба контейнера
например первая вставка контейнер АНГ слов "cat, cеt ,cyt" а в Рус. контейнер "кот, кет, кут " ну и так дальше. Потом делаю поиск в контейнер например в контейнере АНГ. ввожу слово cat оно в алгоритме моему начинает проверять вместимость контейнера, когда находит в другой итератор записывает итератор данной позиции на которой нашло совпадение, и соответственно к данному итератор я вывожу слова из контейнера РУС, так наоборот.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
22.04.2012, 12:14 #18
Цитата Сообщение от botasa Посмотреть сообщение
возвращает -1
Вот прототип: size_t find ( char c, size_t pos = 0 ) const;
size_t - беззнаковое
Сравнивать нужно так
if( std::string::npos != find(...) )

Если тебе возвращается знаковое - выкинь свой компилятор.
Вот тебе код для тестирования компилятора:
C++
1
2
3
4
5
6
7
8
9
10
#include <string>
#include <iostream>
 
int main()
{
    std::cout << typeid( std::string::size_type ).name();
    std::cin.get();
 
    return 0;
}
Добавлено через 4 минуты
Цитата Сообщение от botasa Посмотреть сообщение
"cat, cеt ,cyt" а в Рус. контейнер "кот, кет, кут "
В таком варианте ты вполне можешь и написать рабочую версию, т.к. длина слов совпадает. Но я ведь говорю о реальной ситуации, а не об этой гипотетической. Если слова будут разной длины (а так и будет), то нынешний алгоритм с поиском индекса буквы работать не будет.
"cat cet cyt" и "кошка кет кут" - и всё, ничего не работает.Если ты захочешь перевести второе слово, то вместо "кет" у тебя получится "а к". Т.е. тебе нужно искать не номер буквы, с которого начинается слово, а именно номер слова.
0
botasa
3 / 3 / 0
Регистрация: 18.01.2011
Сообщений: 131
22.04.2012, 12:18  [ТС] #19
у вас так
Сравнивать нужно так
if( std::string::npos != find(...) )

у меня так
a = text.find(word);
if(a >= 0)

ваш код я вижу первый раз, как он у вас работает я не знаю, но мой код даже если вы считаете что он не правильно написан он работает так как мне надо понимаете ?

Добавлено через 2 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
В таком варианте ты вполне можешь и написать рабочую версию, т.к. длина слов совпадает. Но я ведь говорю о реальной ситуации, а не об этой гипотетической. Если слова будут разной длины (а так и будет), то нынешний алгоритм с поиском индекса буквы работать не будет.
"cat cet cyt" и "кошка кет кут" - и всё, ничего не работает.Если ты захочешь перевести второе слово, то вместо "кет" у тебя получится "а к". Т.е. тебе нужно искать не номер буквы, с которого начинается слово, а именно номер слова.
а давайте так я сейчас разберусь из кодировкой при работе с рус. слова и выводом их в консоль и если у меня вопше ничё не получится я прислушаюсь к вашему совету (хотя я не понимаю как оно у вас должно работать в контейнере SET и сам поиск по букве).
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
22.04.2012, 12:23 #20
Цитата Сообщение от botasa Посмотреть сообщение
ваш код я вижу первый раз
Это не мой код, а код из MSDN. Как бы им лучше знать, как их класс правильно работает. Не находишь?
http://msdn.microsoft.com/en-us/library/efzty53k.aspx

Цитата Сообщение от botasa Посмотреть сообщение
if(a >= 0)
Выполняется ВСЕГДА, т.к. а ВСЕГДА больше нуля. (unsigned int)-1 больше нуля.
0
botasa
3 / 3 / 0
Регистрация: 18.01.2011
Сообщений: 131
22.04.2012, 12:35  [ТС] #21
у меня просто int , в который помещаются - 0 и + числа, когда стало что -1 больше 0 ??? если функ. повернет мне -1 или еще какие то минусовые числа то if(a >= 0) не выполняется, в другом случае работает !!!
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
22.04.2012, 12:50 #22
Цитата Сообщение от Deviaphan Посмотреть сообщение
Вот прототип: size_t find ( char c, size_t pos = 0 ) const;
size_t - беззнаковое
Сравнивать нужно так
if( std::string::npos != find(...) )

Если тебе возвращается знаковое - выкинь свой компилятор.
Идёт же преобразование в знаковый int. Так что минус может быть.
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main()
{
 int a;
 size_t b=0xFFFFFFFF;
 a=b;
 printf("a=%d\n",a);
 system("pause");
 return 0;
}
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.04.2012, 13:54 #23
не знаю писали ли это еще раз или нет. еще раз хочу обратить внимание на испольование сетов:
есть два сета с синонимами. в них слова вот так вставляли:
eng.insert("cat");
eng.insert("bird");
rus.insert("кошка");
rus.insert("птичка");

т.к. сет автоматитечки сортирует свое содержимое то по порядку в сетах данные будут вот так находится:
eng: bird, cat.
rus: кошка, птичка.

теперь вы ищете кошку в английском сете. она на второй позиции. ок. лезете в русский сет. а там на второй позиции находится птичка. т.о. ориентироватся на позиции в сетах - нельзя. я уже упоминал об этом.

еще есть глюк с поиском подстроки:
допустим вы храните в сете набор слов через запятые:
("пар, вода, лед") и ("паровоз, теплоход, тачка")
Теперь делаем поиск подстроки пар:
если первой на поиск подстроки пар попадется строка ("паровоз, теплоход, тачка"), то она подойдет, потому что пар - входит в слово паровоз. но это явно не то, что задумывалось.
1
botasa
3 / 3 / 0
Регистрация: 18.01.2011
Сообщений: 131
22.04.2012, 14:54  [ТС] #24
хорошо, дак каким мне образом реализовать эти 2 контейнера чтоб всё было хорошо ??? если мой способ уже не подходит вопше !!!

это прискорбно но оно реально сортируется и это плохо ... я вот подумал а может подобрать слова по которым оно будет в таких позиция как мне надо стоять ???
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
22.04.2012, 15:01 #25
map<string, string> ,где key - Английское слово, value - Русский перевод
0
botasa
3 / 3 / 0
Регистрация: 18.01.2011
Сообщений: 131
22.04.2012, 15:07  [ТС] #26
Цитата Сообщение от Deviaphan Посмотреть сообщение
map<string, string> ,где key - Английское слово, value - Русский перевод
с map курсак уже в другого однокурсника, мне с set попалось, не приходить мне и не сдавать курсак такой как у моего однокурсника ...
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.04.2012, 15:11 #27
если нужен именно std::set и std::map ну никак нельзя, тогда можно юзать такие варианты:
C++
1
2
3
4
5
6
7
8
9
10
11
std::set< std::pair<key_type, std::string>, LessByKeyType >
// где key_type - тип ключа. это может быть инт как в варианте с мапами, который я тут писал,
// это может быть std::string или хз что еще.
 
//LessByKeyType - класс предиката, у которого есть
bool operator () (const std::pair<key_type, std::string>& lhs, const std::pair<key_type, std::string>& rhs) const
{
  return lhs.first < rhs.first;
}
 
//Т.е. он будет в сете сортировать элементы именно по первому мемберу такой вот пары.
А еще чтобы не париться с кодировками, лучше сразу использовать широкие строки, т.е. std::wstring
1
botasa
3 / 3 / 0
Регистрация: 18.01.2011
Сообщений: 131
22.04.2012, 15:36  [ТС] #28
кажется я уловил что вы хотели сказать

не могли б вы ваш код всунуть в этот ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    vector< string > q;
    q.push_back("cat cot cat");
    q.push_back("big bag bog");
    q.push_back("dog dag deg");
    q.push_back("fyk fak fek");
    q.push_back("byba baba bypa");
 
    vector< string > p;
    p.push_back("кот кота коту");
    p.push_back("большой болбшая большие");
    p.push_back("собака собаку собаке");
    p.push_back("фук фак фек");
    p.push_back("буба баба беба");
 
    
    string word;
    cin >> word;
 
    int a;
    vector<string>::iterator myPos;
    vector<string>::iterator pos;
    for(pos = p.begin(); pos != p.end(); pos++) {
        string text = *pos;
        a = text.find(word);
        if(a >= 0)
        {
            myPos = pos;
            break;
        }
    }
 
    if(a >= 0)
    {
        cout << "\n\nyour word is : " << *myPos<< endl;
    }
    else 
    {
        cout << "\nyour word don't find.\n";
        cout << a << endl;
    }
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.04.2012, 16:02 #29
Вот немного подправленный вариант, но с сетами. Вместо std:air - самодельная структурка с идентификатором слов и собственно набором слов. Мемберы такой структуры более понятные, чем first и second у пары. Использовать строки вроде ("кот, котяра, кошак") неправильно. Это я уже писал. Поэтому просто вектор отдельных слов. Использование пары стринг-стринг плохо тем, что позволяет переводить один набор слов в другой, но не наоборот. То, что я тут написал - позволяет переводить слова из обоих наборов. Функция Process не поменялась почти. Только типы и имена переменных. Конкретные словами набивайте контейнеры сами. Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <set>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
#include <iostream>
 
typedef std::vector<std::wstring> Words;
 
struct WordsEntry
{
  unsigned id;
  Words words;
 
  explicit WordsEntry(unsigned theId)
    : id(theId)
  {
  }
 
  WordsEntry(unsigned theId, const Words& theWords)
    : id(theId)
    , words(theWords)
  {
  }
};
 
struct WordEntryLessById
{
  bool operator () (const WordsEntry& lhs, const WordsEntry& rhs) const
  {
    return lhs.id < rhs.id;
  }
};
 
typedef std::set<WordsEntry, WordEntryLessById> Set;
 
std::wostream& operator << (std::wostream& out, const Words& words)
{
  std::copy(words.begin(), words.end(),
    std::ostream_iterator<std::wstring, std::wstring::value_type>(out, L", "));
  return out;
}
 
void Process(const Set& keySet, const Set& assocSet, const std::wstring& word)
{
  std::wcout << L"-----------------------------------------------------" << std::endl;
  std::wcout << L"Processing of the '" << word << L"' word:" << std::endl;
  Set::const_iterator keyIter = keySet.end();
  for (Set::const_iterator it = keySet.begin(), end = keySet.end(); it != end; ++it)
  {
    if (it->words.end() != std::find(it->words.begin(), it->words.end(), word))
    {
      keyIter = it;
      break;
    }
  }
 
  if (keyIter == keySet.end())
  {
    std::wcout << L"The word is not found in key set." << std::endl;
    return;
  }
 
  Set::const_iterator assocIter = assocSet.find(WordsEntry(keyIter->id));
  if (assocIter == assocSet.end())
  {
    std::cout << L"The word is not found in associative set." << std::endl;
    return;
  }
 
  std::wcout << assocIter->words << std::endl;
}
 
int main()
{
  Set eng;
  Set rus;
 
  Words words;
  words.push_back(L"11");
  words.push_back(L"22");
  words.push_back(L"33");
  eng.insert(WordsEntry(0, words));
 
  words.clear();
  words.push_back(L"xx");
  words.push_back(L"yy");
  words.push_back(L"zz");
  rus.insert(WordsEntry(0, words));
 
  words.clear();
  words.push_back(L"33");
  words.push_back(L"44");
  words.push_back(L"55");
  eng.insert(WordsEntry(1, words));
 
  words.clear();
  words.push_back(L"aa");
  words.push_back(L"bb");
  words.push_back(L"cc");
  rus.insert(WordsEntry(1, words));
 
  Process(eng, rus, L"11");
  Process(eng, rus, L"44");
  Process(rus, eng, L"aa");
  Process(rus, eng, L"cc");
  Process(eng, rus, L"xyz");
  Process(rus, eng, L"xyz");
 
  return 0;
}
1
botasa
3 / 3 / 0
Регистрация: 18.01.2011
Сообщений: 131
22.04.2012, 16:21  [ТС] #30
спасибо, никуда не убегайте я иду пробовать код =)

Добавлено через 15 минут
что буква "L" везде обозначает ???
0
22.04.2012, 16:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2012, 16:21
Привет! Вот еще темы с ответами:

Контейнер set - C++
Два множества, элементами которого являются строчные буквы латинского алфавита, представлены с помощью стандартного типа SET. В программе...

Set из STL - C++
Доброго времени суток, ребята. Прошу помощи со словарём. Вот само задание: Написать программу «Англо - русский и русско - английский...

STL set - C++
вопрос почему в строке while( (*ii)!=elem) говорит что я не перегрузил != не могу понять, и почему в строке cout&lt;&lt;*p&lt;&lt;&quot; &quot;; говорит что я...

Ввод данных в контейнер set - C++
Здравствуйте! В первое множество элементы вводятся нормально, но вот во второе множество кладется только последнее значение из первого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru