c++ - 如何处理 vector 以获得所需的输出?

标签 c++ vector

我是自学C++的,所以有些地方有些空白,例如。对容器的一些操作,不同操作的名称等。 因此,请帮我解决这个问题。 (我也很感激将我送到好的资源,这将帮助我选择正确的容器和方法来处理它们。真正的实现示例将有很大帮助,因为通过这种方式对我来说更容易获得它。)

这是我的第一个“真正的”程序。我用 PHP 实现了它,但现在我在学习它时重写为 C++(我可以说它更具挑战性)。

简而言之,读取文件并创建 3 个不同的 vector ,其中包含相应的元素(人名、元素名称和元素数量)。 因此,例如(我知道这不是分配值的方式,它只是为了说明内容):

vector<string> vectorOfNames = {"Adam", "Eva", "Adam", "Adam", "Bruce"};
vector<string> vectorOfItems = {"Apple", "Apple", "Orange", "Pear", "Melon"};
vector<int> vectorOfAmount = {1, 9, 2, 4, 1};

现在,我想表示它(按人和项目)并计算(按数量)这些 vector ,例如。打印类似的东西:

All persons:
Adam
Eva
Bruce

All items:
Apple - 10
Orange - 2
Pear - 4
Melon - 1

Adam have:
Apple - 1
Orange - 2
Pear - 4

Eva have:
Apple - 9

Bruce have:
Melon - 1

在 PHP 中,我使用 *array_keys(array_flip())* 来获取唯一的名称和项目。 在 C++ 中,我发现了这样的东西:

vector< string >::iterator r , w ;

set< string > tmpset ;

for( r = vectorOfNames.begin() , w = vectorOfNames.begin() ; r != vectorOfNames.end() ; ++r )
{
    if( tmpset.insert( *r ).second )
    {
        *w++ = *r ;
    }
}

vectorOfNames.erase( w , vectorOfNames.end() );

它运行良好,但问题是它修改了原始 vectorOfNames。 我应该在应用之前将此 vector 复制到新 vector 还是有其他方法?

至于 PHP 中所需的其余处理,我使用了 foreachif 语句。 我正在为 C++ 尝试不同的方法,但没有任何效果。我完全迷路了.... 我也知道Boost Library里面有一些函数,但是我暂时不想去那里,还是先学基础吧。

另一方面,也许我应该使用其他容器,如 map 或其他容器,以使此处理更容易?

所以如果你仍然明白我的意思并且你没有睡着,请把我推向正确的方向;)

最佳答案

第一步,即获取 std::vector<std::string> 中的所有唯一名称我可能会这样做:

std::vector<std::string> tmp(original);
std::sort(tmp.begin(), tmp.end());
std::unique_copy(tmp.begin(), tmp.end(),
                 std::ostream_iterator<std::string>(std::cout, "\n"));

替代解决方案可以使用辅助 std::set<std::string>但不会按排序顺序打印名称:

std::set<std::string> mark;
std::copy_if(original.begin(), original.end(),
             [&](std::string const& value) { return mark.insert(value); });

(利用 C++ 2011 特性)

其他操作不会直接映射到 C++ 算法的工作方式。为了处理这些,我可能会使用不同的数据布局,例如,将数据存储在 std::vector<std::tuple<std::string, std::string, int> > 中。而不是三个独立的载体。

关于c++ - 如何处理 vector 以获得所需的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12696359/

相关文章:

c++ - getline 语句未获取输入

c++ - Q-learning学习扫雷行为

R: RScript Vector 作为参数

c++ - 共线点 C++

c++ - 结合批处理和 C++

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 转换依赖于 std::vector 初始化列表构造函数的 C++11 代码

c++ - C++ 中的 vector 指针和通过引用传递对象

c++ - 使用 CvMoments 计算 HU 矩时出错

android - 线性加速方向跟踪手机上下运动