2010-02-15 2 views
1

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

с, а, р, я, е, п, т, я,

и я должен добавить недостающие символы к нему
S, A, P, I, e, n, t, i, a, b, c, d ...

Я пытаюсь использовать этот код для поиска существующего значения.

for(char c='a';c!='z';++c) 
    { 
     if (vec.end()!=find(vec.begin(),vec.end(),c)) 
      vec.push_back(c); 
    } 

Находка возвращает last, когда он не может найти значение. Но как узнать, было ли в нем последнее значение?

EDIT

Когда для начала цикла, для «A» возвращает vec.end(), поэтому он не должен идти, но идет в, и добавляет «а» снова в конце концов.

Посмотрите этот отладчик alt text http://img203.imageshack.us/img203/2048/bb1f.jpg

(Исправлена ​​ошибка, я, значение в последней позиции Вставляется в два раза, я должен пропустить это)

+0

Если у вас есть строка "S, A, P, I, е, п, т, я," А. d вы найдете «a», тогда он вернет позицию первого «a». Кроме того, помните, что vec.end() не указывает на последний, это один последний символ «a». – Naveen

ответ

1

Нет, end() не является последним элементом вектора, но проходит мимо него. Чтобы перебрать все элементы, которые вы обычно делаете

for(it= vec.begin(); it!= vec.end(); it++) ... 

Так что, какова бы ни была ваша проблема, это нормально.

1

Когда find успешно возвращает итератор, который указывает на найденная позиция. Поэтому, если значение находится в векторе, возвращаемым значением будет что-то другое, что vec.end(). Условие внутри условия if должно быть ==, а не !=, если вы пытаетесь создать вектор уникальных символов.

0

vec.end() возвращает итератор, позиция которого Последний элемент в векторе. Если он совпадает с последним значением, возвращаемый итератор не будет равен vec.end().

2

Ответы на другие вопросы верны, но вы также должны изменить условие завершения в вашем цикле for на c <= 'z', если хотите, чтобы в ваш список была включена буква z.

EDIT Я не могу помочь, добавив, что с Boost.RangeEx library ваша проблема может быть решена с помощью однострочника:

boost::set_difference(boost::counting_range('a', char('z' + 1)), 
         std::set<char>(vec.begin(), vec.end()), 
         std::back_inserter(vec)); 
3

В вашем случае лучше:

  1. Создать один вектор (bool) с индексами от 'a' до 'z', инициализировать его на false, (i)
  2. Пробег один раз через ваш исходный вектор, установите значение true в другом векторе для каждого символа, который вы найдете,
  3. Запустите один раз через этот новый вектор и для каждого ложного значения добавьте соответствующий символ к оригиналу.

(i) Вы можете использовать actual_index = character - 'a'. Поместите некоторые утверждения здесь и там, чтобы вы не сбрасывали символы за пределами диапазона, который вы проверяете, предположительно «от» до «z» (что, кстати, не является строгим определением того, что такое символ).

Только с одной инициализацией, двумя шагами линейными шагами и без поиска, вы будете готовы.

0

Вы хотите вставить символ в массив, если он НЕ найден, когда it == end.

Вы проверяете, it != end, чтобы вы вставляли символы, когда они уже найдены в строке. Смотрите это:

char v[] = "acef"; 
vector<char> str(v,v+sizeof(v)); 

copy(str.begin(), str.end(), ostream_iterator<char>(cout, ",")); 

cout << endl; 

for (char c = 'a'; c < 'g'; ++c) 
{ 
    vector<char>::iterator it = find(str.begin(),str.end(), c); 
    if (it == str.end()) 
    { 
     str.push_back(c); 
    } 
} 

copy(str.begin(), str.end(), ostream_iterator<char>(cout, ",")); 

выход:

a,c,e,f,, 
a,c,e,f,,b,d, 

Дополнительным пустым символ ,, является нулем в исходной строке "acef" - нуль.

1

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

Взгляните на эту очень полезную диаграмме Adrinael: Container Choice (Adrinael) http://adrinael.net/containerchoice.png

(В вашем случае я считаю, станд :: набор, вероятно, является наиболее подходящим)

0

вы можете начать сортировку вектор

таким образом, вы заметите сразу же пробелы в последовательности

#include <stdio.h> 
#include <stdlib.h> 
#include <vector> 
#include <iostream> 
#include <algorithm> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    vector<char> original; 

    original.push_back('a'); 
    original.push_back('d'); 
    original.push_back('x'); 
    original.push_back('j'); 
    original.push_back('z'); 

    sort(original.begin(), original.end()); 

    vector<char> unseen_chars; 
    char current_char = 0; 
    char last_char = original[0]; 

    for (int i = 1; i <= original.size(); i++) 
    { 
     current_char = original[i]; 
     for (char j = last_char + 1; j < current_char; j++) 
     { 
     unseen_chars.push_back(j); 
     } 

    last_char = current_char; 
    } 
    for (int i = 0; i < unseen_chars.size(); i++) 
    { 
     cout << unseen_chars[i]; 
    } 
    cout << endl; 
Смежные вопросы