Можно ли использовать итератор набора для поиска различий между двумя последовательными элементами набора в c ++? - PullRequest
2 голосов
/ 14 апреля 2020

/ * [То, что я сделал в следующем коде, выполняется вечно, что я должен отредактировать, чтобы получить желаемую разницу между последовательными элементами набора?] * /

include

с использованием пространства имен std;

int main () {

int temp;
set <int> sett ;
set <int>:: iterator itr;
int n=5 ;
itr= sett.begin();


for (int i=0;i<n ; i++){

    cin>> temp ;
    sett.insert(temp);


}

for( itr = sett.begin();itr!=sett.end();itr++){
    if(itr!=sett.end()){
        cout << (*itr++)-(*itr) << " difference"<< endl ;
    }

}


return 0;

}

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Можно ли использовать итератор набора для нахождения разницы между двумя последовательными элементами набора в c ++?

Да.

for( itr = sett.begin();itr!=sett.end();itr++){
//                                      ^^^^^
    if(itr!=sett.end()){    
        cout << (*itr++)-(*itr) << " difference"<< endl ;
//                ^^^^^

Проблема в том, что вы увеличиваете итератор в два раза, поэтому пропускаете элементы. Более того, в случае, когда итератор выполняет обработку последнего элемента, вы в конечном итоге выполняете косвенную передачу через итератор за последним элементом (т.е. конечным итератором).

На самом деле для этого существует стандартный алгоритм. Его имя обычно считается запутанным, но в данном случае это вполне уместно. Встречайте std::adjacent_difference:

std::adjacent_difference(std::begin(sett), std::end(sett),
    std::ostream_iterator<int>(std::cout, " difference\n"));
1 голос
/ 14 апреля 2020

добро пожаловать в SO.

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

std::set<int> elements{};
if(!elements.empty()) {
    auto it = elements.begin();
    const int* last_element{&*(it++)}; /* if elements would be empty this would be undefined behaviour */
    while(it != elements.end()) {
        const auto now = *it++;
        const auto diff = last_element - now;
    }
}
...