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

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

Войти
Регистрация
Восстановить пароль
 
 
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
#1

Expression: vector iterator not decrementable - C++

27.02.2017, 11:44. Просмотров 424. Ответов 21

Требуется в двух файлах удалить повторяющие строки (до первого вхождения)

Примеры:
Name_N
Кликните здесь для просмотра всего текста
<TEXT>
<Tag>TXT_KEY_STAGING_ROOM_CIVS_TAG</Tag>

<English>Nations:</English>
<French>Íàöèè:</French>

<German>Nationen:</German>
<Italian>Nazioni:</Italian>
<Spanish>Naciones:</Spanish>
</TEXT>

"_"+Name_N
Кликните здесь для просмотра всего текста
<TEXT>
<Tag>TXT_KEY_STAGING_ROOM_CIVS_TAG</Tag>
<Russian>Íàöèè:</Russian>
<English>Nations:</English>

<French>Nations :</French>
<German>Nationen:</German>
<Italian>Nazioni:</Italian>
<Spanish>Naciones:</Spanish>
</TEXT>


Создал функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void DupKiller(string Name_N)
{       
        string text;
        vector<string> f1;
        ifstream feng(Name_N);
        while(getline(feng,text)) f1.push_back(text);
        feng.close();
 
        vector<string> f2;
        ifstream frus("_"+Name_N);
        while(getline(frus,text)) f2.push_back(text);
        frus.close();
 
        for (vector<string>::iterator iter1 = f1.begin(); iter1 != f1.end(); iter1++)
            for (vector<string>::iterator iter2 = f2.begin(); iter2 != f2.end(); iter2++)
                if(*iter1 == *iter2)
                {
                    cout << *iter1 << " " << *iter2;
                    f1.erase(iter1--);
                    f2.erase(iter2--);
                    break;
                }               
}
Вывалилась ошибка на строчке
C++
1
f1.erase(iter1--);
0
Миниатюры
Expression: vector iterator not decrementable  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2017, 11:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Expression: vector iterator not decrementable (C++):

vector iterator not decrementable - C++
Здраствуйте! Хочу вывести вектор задом-наперед, все нормально, но после того как оно выводит вектор сразу выскакивает ошибка vector...

Ошибка: iterator not decrementable - C++
компилятор ошибок не выдает, а когда программа начинает работать она периодически выдает такое сообщение - iterator not decrementable, не...

vector<T> template vector<T>::iterator - C++
Здраствуйте! При написании вектора столкнулся с проблемой такого рода: вот код вектора template &lt;typename T&gt; class vector { ...

Struct / Vector / Expression: vector subscript out of range - C++
Добрый вечер. Имеется структура: struct Contact { public: string name; vector&lt;string&gt; phoneNumber; };

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> - C++
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я ставлю закладку итератора, ...

Vector iterator not incrementable - C++
Здравствуйте. Подскажите, из-за чего не работает код? При запуске программы появляется ошибка: &quot;... expression: vector iterator not...

21
GbaLog-
Любитель чаепитий
3122 / 1462 / 351
Регистрация: 24.08.2014
Сообщений: 5,175
Записей в блоге: 1
Завершенные тесты: 2
27.02.2017, 14:14 #16
Цитата Сообщение от GbaLog- Посмотреть сообщение
декрементированием тут не нужны.
...
Цитата Сообщение от eXPonent Посмотреть сообщение
C++
1
iter1--
Цитата Сообщение от eXPonent Посмотреть сообщение
C++
1
iter2--
0
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
27.02.2017, 14:53  [ТС] #17
Опечатка, так?
C++
1
2
3
4
5
6
if(*iter1 == *iter2)
{
    iter1 = f1.erase(iter1);
    iter2 = f2.erase(iter2);
    break;
}
Добавлено через 34 минуты
В итоге получили:
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
void DupKiller(string Name_N)
{       
        string text;
        vector<string> f1;
        ifstream fin(Name_N);
        while(getline(fin,text)) f1.push_back(text);
        fin.close();
 
        vector<string> f2;
        fin.open("_"+Name_N);
        while(getline(fin,text)) f2.push_back(text);
        fin.close();
 
        for(vector<string>::iterator iter1 = f1.begin(); iter1 != f1.end(); iter1++)
            if(((*iter1).find("     <German>") != string::npos)||((*iter1).find("       <Spanish>") != string::npos)||((*iter1).find("      <Italian>") != string::npos))
                iter1 = f1.erase(iter1);
        for(vector<string>::iterator iter2 = f2.begin(); iter2 != f2.end(); iter2++)
            if(((*iter2).find("     <German>") != string::npos)||((*iter2).find("       <Spanish>") != string::npos)||((*iter2).find("      <Italian>") != string::npos))
                iter2 = f2.erase(iter2);
 
        for(vector<string>::iterator iter1 = f1.begin(); iter1 != f1.end(); iter1++)
            for(vector<string>::iterator iter2 = f2.begin(); iter2 != f2.end(); iter2++)
                if(*iter1 == *iter2)
                {
                    iter1 = f1.erase(iter1);
                    iter2 = f2.erase(iter2);
                    break;
                } 
 
        ofstream fout(Name_N);
        for (vector<string>::iterator iter1 = f1.begin(); iter1 != f1.end(); iter1++) fout << *iter1 << endl;
        fout.close();
 
        fout.open("_"+Name_N);
        for (vector<string>::iterator iter2 = f2.begin(); iter2 != f2.end(); iter2++) fout << *iter2 << endl;
        fout.close();
}
но получилось два файла:
(и даже невооруженным взглядом видно, что программа сработала неверно (точнее не полностью удалила дубли)
Строчка:
Кликните здесь для просмотра всего текста
<English>Players may lead any Nation with any Leader.</English>

и другие совпадают
0
Вложения
Тип файла: 7z Colonization.7z (29.7 Кб, 1 просмотров)
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
27.02.2017, 15:29  [ТС] #18
Вернув обратно эти строчки кода, код заработал более коректно
C++
1
2
3
4
5
6
7
8
for(vector<string>::iterator iter1 = f1.begin(); iter1 != f1.end(); iter1++)
            for(vector<string>::iterator iter2 = f2.begin(); iter2 != f2.end(); iter2++)
                if(*iter1 == *iter2)
                {
                    if(iter1 != f1.begin()) f1.erase(iter1--);
                    if(iter2 != f2.begin()) f2.erase(iter2--);
                    break;
                }
Но остались фразы типа
Кликните здесь для просмотра всего текста
<Italian>I turni sono limitati da un conto alla rovescia basato sulla dimensione della colonia più grossa</Italian>
0
Вложения
Тип файла: 7z Colonization.7z (17.2 Кб, 1 просмотров)
GbaLog-
Любитель чаепитий
3122 / 1462 / 351
Регистрация: 24.08.2014
Сообщений: 5,175
Записей в блоге: 1
Завершенные тесты: 2
27.02.2017, 16:05 #19
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
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
 
int main()
{
    std::ifstream f1("CIV4GameText_Colonization.xml");
    std::ifstream f2("_CIV4GameText_Colonization.xml");
    
    std::vector<std::string> v1;
    std::vector<std::string> v2;
    
    for (std::string tmp; std::getline(f1, tmp); )
        v1.push_back(tmp);
    
    for (std::string tmp; std::getline(f2, tmp); )
        v2.push_back(tmp);
    
    f1.close();
    f2.close();
    
    std::vector<std::string> res1(v1);
    std::vector<std::string> res2(v2);
    
    res1.erase(std::remove_if(res1.begin(), res1.end(), [&] (const std::string & n) { return std::find(v2.begin(), v2.end(), n) != v2.end(); }), res1.end());
    res2.erase(std::remove_if(res2.begin(), res2.end(), [&] (const std::string & n) { return std::find(v1.begin(), v1.end(), n) != v1.end(); }), res2.end());
    
    std::ofstream fileOut1("RESULTCIV4GameText_Colonization.xml");
    std::ofstream fileOut2("RESULT_CIV4GameText_Colonization.xml");
    
    for (const auto & it : res1)
        fileOut1 << it << '\n';
    
    for (const auto & it : res2)
        fileOut2 << it << '\n';
}
P.S. Данная программа рабочая, и дальше с вами дискуссию о том, почему у вас ваш вариант не работает я не собираюсь. Изучайте контейнеры и итераторы. Джосаттис вам в помощь.
1
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
27.02.2017, 17:11  [ТС] #20
На этот код:
Цитата Сообщение от GbaLog- Посмотреть сообщение
C++
1
2
3
4
5
    for (const auto & it : res1)
        fileOut1 << it << '\n';
    
    for (const auto & it : res2)
        fileOut2 << it << '\n';
выкидывает это (студия 10):
0
Миниатюры
Expression: vector iterator not decrementable  
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
27.02.2017, 17:50  [ТС] #21
Немного изменив функцию:
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
void DupKiller_New(string Name_N)
{
    std::ifstream f1("CIV4GameText_Colonization.xml");
    std::ifstream f2("_CIV4GameText_Colonization.xml");
    
    std::vector<std::string> v1;
    std::vector<std::string> v2;
    
    for (std::string tmp; std::getline(f1, tmp); )
        v1.push_back(tmp);
    
    for (std::string tmp; std::getline(f2, tmp); )
        v2.push_back(tmp);
    
    f1.close();
    f2.close();
 
    for(vector<string>::iterator iter1 = v1.begin(); iter1 != v1.end(); iter1++)
        if(((*iter1).find("<German>") != string::npos)||((*iter1).find("<Spanish>") != string::npos)||((*iter1).find("<Italian>") != string::npos))
            iter1 = v1.erase(iter1);
    for(vector<string>::iterator iter2 = v2.begin(); iter2 != v2.end(); iter2++)
        if(((*iter2).find("<German>") != string::npos)||((*iter2).find("<Spanish>") != string::npos)||((*iter2).find("<Italian>") != string::npos))
            iter2 = v2.erase(iter2);
    
    std::vector<std::string> res1(v1);
    std::vector<std::string> res2(v2);
    
    res1.erase(std::remove_if(res1.begin(), res1.end(), [&] (const std::string & n) { return std::find(v2.begin(), v2.end(), n) != v2.end(); }), res1.end());
    res2.erase(std::remove_if(res2.begin(), res2.end(), [&] (const std::string & n) { return std::find(v1.begin(), v1.end(), n) != v1.end(); }), res2.end());
    
    ofstream fileOut1("RESULT"+Name_N);
    for (vector<string>::iterator iter1 = res1.begin(); iter1 != res1.end(); iter1++) fileOut1 << *iter1 << endl;
    fileOut1.close();
 
    ofstream fileOut2("RESULT_"+Name_N);
    for (vector<string>::iterator iter2 = res2.begin(); iter2 != res2.end(); iter2++) fileOut2 << *iter2 << endl;
    fileOut2.close();
}
программа запустилась, но результат тот же:
0
Миниатюры
Expression: vector iterator not decrementable  
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
27.02.2017, 17:57  [ТС] #22
т.е. перепутал изображение:
(не сильно изменилась картина)
0
Миниатюры
Expression: vector iterator not decrementable  
Вложения
Тип файла: 7z temp.7z (17.0 Кб, 0 просмотров)
27.02.2017, 17:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2017, 17:57
Привет! Вот еще темы с ответами:

vector<pointer>::iterator - C++
В общем, есть некий родительский объект, в котором хранится динамический массив указателей на дочерние объекты. Требуется пройтись по всем...

STL vector iterator - C++
есть список в списке... ..точнее: vector &lt;Class1*&gt; mapClass1; а уже в Class1 определён вектор vector &lt;Class2*&gt; mapClass2; ...

copy, iterator, vector - C++
#include &lt;istream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;iterator&gt; int main( ) { std::vector &lt;int&gt;...

Vector iterator + offset out of range - C++
Вылазит такая ошибка. Подскажите, из-за чего она может вылезти?


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

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

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