Как получить строку объединения из векторной строки? - PullRequest
1 голос
/ 26 сентября 2011

У меня есть векторная строка, заполненная некоторыми расширениями файла следующим образом:

vector<string> vExt;
vExt.push_back("*.JPG;*.TGA;*.TIF");
vExt.push_back("*.PNG;*.RAW");
vExt.push_back("*.BMP;*.HDF");
vExt.push_back("*.GIF");
vExt.push_back("*.JPG");
vExt.push_back("*.BMP");

Теперь я хочу получить строку объединения из вышеупомянутой векторной строки, в которой каждое расширение файла должноуникальный в результирующей строке.Что касается моего данного примера, результирующая строка должна иметь вид "*.JPG;*.TGA;*.TIF;*.PNG;*.RAW;*.BMP;*.HDF;*.GIF".

. Я знаю, что std :: unique может удалять последовательные дубликаты в диапазоне.Это не работает с моим состоянием.Не могли бы вы показать мне, как это сделать?Спасибо!

Ответы [ 3 ]

4 голосов
/ 26 сентября 2011

Смотрите вживую здесь: http://ideone.com/0fmy0 ( FIXED )

#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <set>

int main()
{
    std::vector<std::string> vExt;
    vExt.push_back("*.JPG;*.TGA;*.TIF");
    vExt.push_back("*.PNG;*.RAW");
    vExt.push_back("*.BMP;*.HDF");
    vExt.push_back("*.GIF");
    vExt.push_back("*.JPG");
    vExt.push_back("*.BMP");

    std::stringstream ss;
    std::copy(vExt.begin(), vExt.end(),
            std::ostream_iterator<std::string>(ss, ";"));

    std::string element;
    std::set<std::string> unique;
    while (std::getline(ss, element, ';'))
        unique.insert(unique.end(), element);

    std::stringstream oss;

    std::copy(unique.begin(), unique.end(),
            std::ostream_iterator<std::string>(oss, ";"));

    std::cout << oss.str() << std::endl;

    return 0;
}

выход:

*.BMP;*.GIF;*.HDF;*.JPG;*.PNG;*.RAW;*.TGA;*.TIF;
1 голос
/ 26 сентября 2011

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

0 голосов
/ 26 сентября 2011

Вам необходимо проанализировать строки, содержащие несколько расширений файлов, а затем вставить их в вектор. После этого std::unique будет делать то, что вы хотите. Взгляните на класс Boost.Tokenizer, который должен сделать это тривиальным.

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