c++ - 将字符串数组转换为整数数组

标签 c++ arrays transform

我有以下字符串数组:

std::string names_str[7] = {"Alex","Louis","Alex","Simon","Matthew", "Carl", "Simon"};

我想创建一个大小相同的新整数数组,并且每个索引元素应等于原始字符串数组中的字符串元素。最终结果应如下所示:

int names[7] = {0, 1, 0, 2, 3, 4, 2};

如何实现一种算法,以这种方式用数字填充我的整数数组?

我已经开始使用这样的伪代码,但到目前为止它绝对没有意义:

for (int i = 0; i < 7; i++) {
    int counter = 0;
    if names_str[i] has already been used
        names[i] = assign the number
    else
        names[i] = counter;
    counter++;
}

最佳答案

您可以使用 std::map跟踪已知的字符串计数器,例如:

#include <string>
#include <map>

std::string names_str[7] = {"Alex", "Louis", "Alex", "Simon", "Matthew", "Carl", "Simon"};
int names[7];

std::map<std::string, int> counter_map;
int counter = 0;

for (int i = 0; i < 7; ++i)
{
    auto iter = counter_map.find(names_str[i]);
    if (iter == counter_map.end())
        iter = counter_map.insert(std::make_pair(names_str[i], counter++)).first;
    names[i] = iter->second;
}

Live Demo

或者,由于 insert() 会在键已存在的情况下将 iterator 返回到现有的带键元素,因此您可以通过 find() 避免冗余搜索:

#include <string>
#include <map>

std::string names_str[7] = {"Alex", "Louis", "Alex", "Simon", "Matthew", "Carl", "Simon"};
int names[7];

std::map<std::string, int> counter_map;
int counter = 0;

for (int i = 0; i < 7; ++i)
{
    auto ret = counter_map.insert(std::make_pair(names_str[i], counter));
    if (ret.second) ++counter;
    names[i] = ret.first->second;
}

Live Demo

无论哪种方式,由于您想要将一个数组“转换”为另一个相同大小的数组,因此这是 std::transform() 的一个很好的用例:

#include <string>
#include <map>
#include <algorithm>

std::string names_str[7] = {"Alex", "Louis", "Alex", "Simon", "Matthew", "Carl", "Simon"};
int names[7];

std::map<std::string, int> counter_map;
int counter = 0;

std::transform(std::begin(names_str), std::end(names_str), std::begin(names),
    [&](const std::string &name) {
        auto iter = counter_map.find(name);
        if (iter == counter_map.end())
            iter = counter_map.insert(std::make_pair(name, counter++)).first;
        return iter->second;
    }
);

Live demo

#include <string>
#include <map>
#include <algorithm>

std::string names_str[7] = {"Alex", "Louis", "Alex", "Simon", "Matthew", "Carl", "Simon"};
int names[7];

std::map<std::string, int> counter_map;
int counter = 0;

std::transform(std::begin(names_str), std::end(names_str), std::begin(names),
    [&](const std::string &name) {
        auto ret = counter_map.insert(std::make_pair(name, counter));
        if (ret.second) ++counter;
        return ret.first->second;
    }
);

Live Demo

关于c++ - 将字符串数组转换为整数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53365994/

相关文章:

c++ - 未初始化的结构成员是否总是设置为零?

c++ - 在 64 位操作系统上使用 WaitForSingleObject 的问题

javascript - Array.map() "syntax Error"in IE11,映射多个JSON Object字段

css - 如何使用css3获得这个?

html - 如何将标题旋转 270 度?

c++ - std::vector 的类似安置结构

ios - 两个用 NSIndexPath 填充的通用数组的补充/交集

java - 我的图像在 PDF 文档中返回为空白

mysql - 如何将行转换为重复的基于列的数据?

C++ 类成员检查是否为模板