2012-06-11 2 views
0

У меня есть вектор строк: vectorElements Я хотел бы создать вектор * char, чтобы указать на начало каждой строки. Моя цель состоит в том, чтобы иметь возможность проходить через каждую строку, символ по характеру. В конечном счете, я хотел бы отсортировать вектор строк. Примечание: Строки могут содержать целые значения. В этом случае, я буду сортировать, основываясь на их числовом значении.создание векторов указателей символов для указания на вектор строк

+0

Вы можете написать в C++? Или вы должны писать в C-коде? – nhahtdh

+0

Я делаю это в C++. – NicholasNickleby

+0

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

ответ

2

Если вы пишете в C++, то лучше использовать C++ string вместо массива в стиле C из char. Вы все равно можете перебирать каждый символ с помощью получения итератора с begin() и использовать перегруженный оператор ++ на итераторе для перехода к следующему символу (проверьте с помощью итератора, возвращаемого end(), чтобы узнать, достигли ли вы конца строки или нет). Вы также можете ссылаться на символ в строке в стиле C с помощью перегруженного оператора [].

Следовательно, vector<string> может быть тем, что вам нужно.

Для сортировки строк вы можете использовать функцию sort в заголовке algorithm. Поскольку вы не сортируете их лексически все время, вы должны определить свою собственную функцию, которая сравнивается между двумя строками.

ПСЕВДОКОД для сравнения:

while (i < str1.length() && i < str2.length()) 
    if (!isDigit(str1[i]) || !isDigit(str2[i])) 
    // Lexical comparison 
    if (str1[i] != str2[i]) 
     i++ 
    else 
     return str1[i] < str2[i] 
    else // If both are digits 
    // parseInt will parse the number starting from current position 
    // as positive integer 
    // - It will consume as many characters as possible (greedily) and 
    // return the parsed number plus the number of characters consumed 
    // - If the number is very large (exceed 64-bit), you may want to 
    // only find the length of the number and write another 
    // comparison function for big numbers. 
    // The code below assumes no overflow 
    (num1, len1) = parseInt(str1, i) 
    (num2, len2) = parseInt(str2, i) 
    if (num1 == num2) 
     i += len1 
    else 
     return num1 < num2 

if (str1.length() == str2.length()) 
    return false 
else 
    return str1.length() < str2.length() 
0

Вы можете использовать std::sort.

for (int i=0; i<vec.size(); ++i) 
{ 
    std::string & str = vec[i]; 
    std::sort(str.begin(), str.end()); 
} 

Demo

+0

Вам нужно будет добавить произвольный компаратор для удовлетворения желания OPs обрабатывать строки, которые «содержат числовое значение», по сравнению с лексиграфическим типом по умолчанию. – dmckee

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