Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从向量字符串中获取并集的字符串?_C++_Stl_Vector - Fatal编程技术网

C++ 如何从向量字符串中获取并集的字符串?

C++ 如何从向量字符串中获取并集的字符串?,c++,stl,vector,C++,Stl,Vector,我有一个向量字符串,其中填充了一些文件扩展名,如下所示: 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"); 向量vExt; vExt.推回(“*.

我有一个向量字符串,其中填充了一些文件扩展名,如下所示:

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");
向量vExt; vExt.推回(“*.JPG;*.TGA;*.TIF”); vExt.push_back(“*.PNG;*.RAW”); vExt.push_back(“*.BMP;*.HDF”); vExt.push_back(“*.GIF”); vExt.推回(“*.JPG”); vExt.push_back(“*.BMP”); 我现在想从上面提到的向量字符串中得到一个并集字符串,其中每个文件扩展名在结果字符串中都必须是唯一的。对于我给出的示例,结果字符串的形式应为“
”*.JPG;*.TGA;*.TIF;*.PNG;*.RAW;*.BMP;*.HDF;*.GIF”


我知道std::unique可以删除范围内的连续重复项。这不符合我的条件。你能告诉我怎么做吗?谢谢大家!

我将每个字符串分成几个组成部分(使用分号作为分隔符),并将结果标记粘贴到一个集合中。该集合的结果内容就是您要查找的内容。

我将每个字符串分成组成部分(使用分号作为分隔符),并将结果标记粘贴到集合中。该集合的结果内容就是您要查找的内容。

您需要解析包含多个文件扩展名的字符串,然后将它们推送到向量中。之后,
std::unique
将执行您想要的操作。看看Boost.Tokenizer类,这应该使它变得简单。

您需要解析包含多个文件扩展名的字符串,然后将它们推送到向量中。之后,
std::unique
将执行您想要的操作。看看Boost.Tokenizer类,这应该会让它变得很简单。

在这里查看它:(修复了它)

现场观看:(已修复)



结果输出的排序顺序重要吗?@Foo-Bah:我不关心结果字符串中元素的顺序。如何使用非boost版本的标记化来完成我的工作?谢谢。@sehe:没人想成为受虐狂。我想使用生成的字符串作为目录监视例程的include筛选器。所以,不允许重复。@goldenlie:我指的是评论中习惯性的“你想要炸薯条吗?”。结果是我没有很好地阅读样本数据。修复了我的回答结果输出的排序顺序是否重要?@Foo-Bah:我不关心结果字符串中元素的顺序。如何使用非boost版本的标记化来完成我的工作?谢谢。@sehe:没人想成为受虐狂。我想使用生成的字符串作为目录监视例程的include筛选器。所以,不允许重复。@goldenlie:我指的是评论中习惯性的“你想要炸薯条吗?”。结果是我没有很好地阅读样本数据。修正了我的回答非boost版本的标记化需要3行代码,避免了使用boostlibraries@aix:谢谢你的快速回复。有没有一种不用boost库就可以做到这一点的方法?我真的不想使用BOOST库来完成这种simpel工作。非BOOST版本的标记化需要3行代码,避免了使用BOOSTlibraries@aix:谢谢你的快速回复。有没有一种不用boost库就可以做到这一点的方法?我真的不想用BOOST库来完成这种简单的工作。谢谢你的回答!据我所知,std::unique可以删除范围内的连续重复项,例如:int-myints[]={10,20,20,30,30,20,20,10};//10202003002010向量myvector(myints,myints+9);vector::iterator;//使用默认比较:it=unique(myvector.begin(),myvector.end());//10 20 30 20 10 ? ? ? ? myvector.resize(it-myvector.begin());//10 20 30 20 10您需要对向量进行排序,否则重复项将不相邻。当然,您需要为std::sort和std::unique使用一致的谓词。如果“.jpg”是“.jpg”的副本,它们应该一起排序。谢谢您的回答!据我所知,std::unique可以删除范围内的连续重复项,例如:int-myints[]={10,20,20,30,30,20,20,10};//10202003002010向量myvector(myints,myints+9);vector::iterator;//使用默认比较:it=unique(myvector.begin(),myvector.end());//10 20 30 20 10 ? ? ? ? myvector.resize(it-myvector.begin());//10 20 30 20 10您需要对向量进行排序,否则重复项将不相邻。当然,您需要为std::sort和std::unique使用一致的谓词。如果“.jpg”是“.jpg”的副本,它们应该一起排序。@MSalters:oops,读取太快(没有读取数据)。固定的now@sehe:非常感谢!我对你的“简短清晰”计划进行了测试。它只是将所有元素字符串连接在一起,形成一个大字符串。它还包括重复的文件扩展名,如*.JPG和*.BMP。@goldenley:谢谢你的确认,我想:)它不仅仅是这样做的,但我同意给出的测试数据,净效果是一样的。我的错。查看固定版本?@MSalters:oops,读取太快(未读取数据)。固定的now@sehe:非常感谢!我对你的“简短清晰”计划进行了测试。它只是将所有元素字符串连接在一起,形成一个大字符串。它还包括重复的文件扩展名,如*.JPG和*.BMP。@goldenley:谢谢你的确认,我想:)它不仅仅是这样做的,但我同意给出的测试数据,净效果是一样的。我的错。看到固定版本了吗?
#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;