C++ 如何使用map从CPP中带有向量的文件中获取唯一值?

C++ 如何使用map从CPP中带有向量的文件中获取唯一值?,c++,dictionary,vector,stl,C++,Dictionary,Vector,Stl,我有一些数据类型的vector(比如-int),我只需要从文件中返回唯一的值?我是新使用STL的。因此,我不知道如何使用map来实现它,因为我读到map只接受唯一的值。如果我只是向后推,那么它将接受所有值,而不考虑其唯一性。用于唯一值的正确容器是std::set或std::unordered\u set: std::set<int> s; s.insert(4); // s has size 1 s.insert(5); // s has size 2 s.insert(4); //

我有一些数据类型的
vector
(比如-
int
),我只需要从文件中返回唯一的值?我是新使用STL的。因此,我不知道如何使用
map
来实现它,因为我读到
map
只接受唯一的值。如果我只是向后推,那么它将接受所有值,而不考虑其唯一性。

用于唯一值的正确容器是
std::set
std::unordered\u set

std::set<int> s;
s.insert(4); // s has size 1
s.insert(5); // s has size 2
s.insert(4); // s still has size 2
。。。或者,我想你可以在最后使用一种很少使用的算法()删除重复项,这可能会引起一些人的注意:

void uniqify(std::vector<int>& v) {
    std::sort(v.begin(), v.end());
    v.erase(std::unique(v.begin(), v.end()), v.end());
}

用于唯一值的正确容器是
std::set
std::unordered\u set

std::set<int> s;
s.insert(4); // s has size 1
s.insert(5); // s has size 2
s.insert(4); // s still has size 2
。。。或者,我想你可以在最后使用一种很少使用的算法()删除重复项,这可能会引起一些人的注意:

void uniqify(std::vector<int>& v) {
    std::sort(v.begin(), v.end());
    v.erase(std::unique(v.begin(), v.end()), v.end());
}

std::map
将允许您处理唯一键到某些值(可能是唯一的,也可能不是唯一的)的映射。在数学方面,您可以将其视为从键集到数据集值集的满射函数

如果您的目标是保持唯一的索引(或键),那么您需要的就是
std::map
。否则,使用
std::set
存储唯一值

现在,要从数据集中只保留唯一的值,基本上需要删除多次出现的值。最简单的算法是将文件中的值作为键添加到映射中,其对应的值是该项在文件中出现次数的计数器。在文件中首次满足值时,将计数器初始化为1,并在每次再次满足值时递增。解析完整个文件后,只需保留值正好为1的键

计算数值:

template <typename key>
void count(std::istream &is, std::map<key,int> &map){
    while (!is.eof() && is.good()){
        key << is;
        auto it = map.find(key);
        if (it == map.end())
            map[key] = 1;
        else (*it)++;
    }
}
地图过滤:

std::remove_if (map.begin(), map.end(), duplicate);

std::map
将允许您处理唯一键到某些值(可能是唯一的,也可能不是唯一的)的映射。在数学方面,您可以将其视为从键集到数据集值集的满射函数

如果您的目标是保持唯一的索引(或键),那么您需要的就是
std::map
。否则,使用
std::set
存储唯一值

现在,要从数据集中只保留唯一的值,基本上需要删除多次出现的值。最简单的算法是将文件中的值作为键添加到映射中,其对应的值是该项在文件中出现次数的计数器。在文件中首次满足值时,将计数器初始化为1,并在每次再次满足值时递增。解析完整个文件后,只需保留值正好为1的键

计算数值:

template <typename key>
void count(std::istream &is, std::map<key,int> &map){
    while (!is.eof() && is.good()){
        key << is;
        auto it = map.find(key);
        if (it == map.end())
            map[key] = 1;
        else (*it)++;
    }
}
地图过滤:

std::remove_if (map.begin(), map.end(), duplicate);

如果使用
std::map
(或
std::set
),即使多次设置,键(对应值)仍将保持唯一。使用std::set执行此操作的替代方法是。如果使用
std::map
(或
std::set
),键(对应值)即使多次设置,也将保持唯一性。使用std::set执行此操作的替代方法是。
std::set
始终保持唯一性,并且易于使用,但速度相当慢
std::sort
/
std::unique
/
擦除
要做的工作稍微多一些,但通常要快一些。我想问题是如何只获取文件中出现过一次的数字。。。不仅仅是剔除重复项。
std::set
始终保持唯一性,使用方便,但速度相当慢
std::sort
/
std::unique
/
擦除
要做的工作稍微多一些,但通常要快一些。我想问题是如何只获取文件中出现过一次的数字。。。不仅仅是为了剔除重复项。