2012-02-13 1 views
1

Я пытаюсь сделать вектор, который содержит указатели на каждую из первых строк в векторе вектора строк. Я собираюсь пропустить first_words_in_subvecs в программу \bin\sort для их сортировки/печати. Я полагал, что это пустая трата времени/пространства процессора, чтобы создать новый вектор фактических строк, так как я просто собираюсь их пропускать. Правильно ли я думаю, что быстрее будет указывать указатели на строки, которые я хочу отправить? И почему этот код не работает? Я не получаю никаких предупреждений или ошибок, но это вызывает ошибки при запуске.Как сделать вектор указателей на элементы в другом подвектор?

int print_sorted_subvectors(vector< vector<string> > &sorted_subsets_vec) 
{ 
    vector<string*> first_words_in_subvecs; 

    for(int i = 0; i < sorted_subsets_vec.size(); i++) 
    { 
     first_words_in_subvecs[i] = &sorted_subsets_vec[i][0]; 
    } 
} 
+1

Вы знаете ['std :: sort()'] (http://en.cppreference.com/w/cpp/algorithm/sort), правильно? –

+0

ну я сейчас! это будет проще ... мы использовали fork и bin \ sort для другой части задания, поэтому я собирался использовать его снова, но это будет намного проще ... глупых труб ... так что тогда Наверное, мне придется копировать, а не указывать. Но как это будет сделано? Мне все еще любопытно. – Marty

ответ

1

Возможно, нет необходимости хранить указатели на строки в векторе. Класс std::string довольно эффективен, используя такие методы, как copy-on-write, чтобы избежать ненужных копий фактических строковых данных. Вероятно, у вас не будет проблемы с эффективностью, если first_words_in_subvecs является обычным vector<string> (и ваш код будет легче понять и более надежно).

Трудно сказать, почему ваш текущий код является segfault. Вы уверены, что каждый подвектор от sorted_subsets_vec не пуст?

+0

это может быть. есть ли подобная функция, которая пройдет через вектор и скажет вам, какой элемент наименьший? Наверное, мне действительно не нужно его сортировать. просто нужно найти наименьший элемент. Работает min_element? – Marty

+0

@FrederickCraine: Yup, ['std :: min_element'] (http://en.cppreference.com/w/cpp/algorithm/min_element) будет делать то, что вы хотите. Это возвращает итератор, поэтому проверяйте на '.end()', чтобы увидеть, есть ли какие-либо элементы вообще (или сначала проверьте '.empty()'). –

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