2015-08-05 3 views
-1

Программа добавляет разные строки в набор. Итератор проверяет набор для определенной строки, чего я хочу достичь, это получить строку, в которой итератор найдет эту определенную строку. Можно ли получить это с помощью набора или мне нужно создать вектор? Причина, по которой я использую наборы, заключается в том, что я также не хочу иметь дубликаты в конце. Это немного странно, я знаю, надеюсь, вы поймете.C++ Использование набора, итератора, поиск строки, где был найден дубликат

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

#include <iostream> 
#include <set> 
#include <string> 
#include <vector> 
#include <atlstr.h> 
#include <sstream> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
set<string> test; 
set<string>::iterator it; 
vector<int> crossproduct(9, 0); 

for (int i = 0; i < 6; i++) 
{ 
    crossproduct[i] = i+1; 
} 

crossproduct[6] = 1; 
crossproduct[7] = 2; 
crossproduct[8] = 3; 


for (int i = 0; i < 3; i++) 
{ 
    ostringstream cp; cp.precision(1); cp << fixed; 
    ostringstream cp1; cp1.precision(1); cp1 << fixed; 
    ostringstream cp2; cp2.precision(1); cp2 << fixed; 

    cp << crossproduct[i*3]; 
    cp1 << crossproduct[i*3+1]; 
    cp2 << crossproduct[i*3+2]; 

    string cps(cp.str()); 
    string cps1(cp1.str()); 
    string cps2(cp2.str()); 

    string cpstot = cps + " " + cps1 + " " + cps2; 

    cout << "cpstot: " << cpstot << endl; 

    it = test.find(cpstot);  

    if (it != test.end()) 
     { 
      //Display here the line where "1 2 3" was found 
      cout << "i: " << i << endl; 
     } 


    test.insert(cpstot); 
} 

set<string>::iterator it2; 

for (it2 = test.begin(); it2 != test.end(); ++it2) 
{ 
    cout << *it2 << endl; 
} 

cin.get(); 

return 0; 
} 
+0

Что именно вы пытаетесь сделать. Ваш вопрос непонятен. – NathanOliver

+1

В стороне: insert возвращает пару, содержащую first = iterator, в вставленный элемент и second = bool true, если элемент был вставлен и false, если он уже присутствует. Поэтому 'if (test.insert (cpstot) .second) {cout <<" i: "<< i << endl;}' заменит 'test.find' и' it! = Test.end() ' – user4581301

+0

Вопрос: вам нужен номер строки оригинала или номер строки найденного дубликата? – user4581301

ответ

2

«номер строка» не очень значимый для std::set<string>, потому что, как вы добавляете больше строк в набор, вы можете изменить порядок , в котором существующие строки повторяются с помощью (что примерно такое же число «номер строки», что и сам set::set ).

Вот альтернатива, которая может работать лучше: std::map<std::string, int> test. Как вы это используете, вы держите «счетчик строк» ​​n где-то. Каждый раз, когда вам нужно поставить новую строку cpstot в вашем наборе, у вас есть такой код:

std::map<std::string>::iterator it = test.find(cpstot); 
    if (it == test.end()) 
    { 
    test[cpstot] = n; 
    // alternatively, test.insert(std::pair<std::string, int>(cpstot, n)) 
    ++n; 
    } 
    else 
    { 
    // this prints out the integer that was associated with cpstot in the map 
    std::cout << "i: " << it->second; 

    // Notice that we don't try to insert cpstot into the map in this case. 
    // It's already there, and we don't want to change its "line number", 
    // so there is nothing good we can accomplish by an insertion. 
    // It's a waste of effort to even try. 
    } 

Если вы установили n = 0, прежде чем вы начали помещать любые строки в test затем (и не связываться с значение n любым другим способом) , тогда вы получите строки со строками «номера строк» ​​0, 1, 2 и т. д. в test и n будет числом строк, хранящихся в test.

Кстати, ни std::map<std::string, int>::iterator, ни std::set<std::string>::iterator гарантированно перебирать строки в той последовательности, в которой они были первой вставленной. Вместо этого то, что вы получите, это строки в любом порядке, который объект сравнения ставит строковые значения. (я думаю, что по умолчанию вы получите их обратно в лексикографическом порядке, то есть «алфавитный».) Но при сохранении оригинального «номер строки» каждой строки в std::map<std::string, int> test, когда вы готовы распечатать список строк, которые вы можете скопировать строку-пару целых от test к новому объекту, std::map<int, std::string> output_sequence, и сейчас (если вы не переопределить объект сравнительного по умолчанию) когда вы перебирать output_sequence вы получите его содержания отсортировано по линии номер. (тогда вы, вероятно, захотите получить строку из поля итератора second.)

+0

Это решение работает для меня, спасибо вам большое –

Смежные вопросы