c++ - C++ 中 vector 的 vector 的使用 & push_back( )

标签 c++ vector

我是 C++ 新手,这里可能缺少一些非常基本的东西,但我正在尝试创建 vector 的 vector

#include <iostream>
#include <stack>
#include <string>
#include <map>
#include <vector>
#include <algorithm>


using namespace std;

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs)
    {
        vector<vector<string>> result;
        map<string,vector<string>> myMap;

        if(strs.size() == 0)
        {
            return result;
        }

        for(string s : strs)
        {
            string temp = s;
            sort(temp.begin(),temp.end());
            auto it = myMap.find(temp);
            if(it != myMap.end())
            {
                it->second.push_back(s);
            }
            else
            {
                vector<string> newVector;
                newVector.push_back(s);
                myMap.insert(pair<string,vector<string>>(temp,newVector));
                result.push_back(newVector);
            }
        }
        cout<< myMap["abt"].size() <<endl;
        return result;
    }
};


int main(int argc, const char * argv[])
{
    Solution mySolution;
    vector<string> myStrings {"eat", "tea", "tan", "ate", "nat", "bat"};
    auto result = mySolution.groupAnagrams(myStrings);

    for(vector<string> v: result)
    {
        //cout << v.size() << endl;
        for(string s: v)
        {
            cout << s << " ";
        }
        cout << endl;
    }
    return 0;
}

我期待这样的输出

[
  ["ate", "eat","tea"],
  ["nat","tan"],
  ["bat"]
]

当我尝试在 main() 中打印 vector 的 vector 时,我得到的所有 vector 的大小均为 1。

当我打印 map 中 vector 的大小时,这些大小对我来说看起来不错。我在这里缺少什么?

更新 -

通过以下更改修复了该问题

for(string s : strs)
{
    string temp = s;
    sort(temp.begin(),temp.end());
    auto it = myMap.find(temp);
    if(it != myMap.end())
    {
        it->second.push_back(s);
    }
    else
    {
        vector<string> newVector;
        newVector.push_back(s);
        myMap.insert(pair<string,vector<string>>(temp,newVector));
    }
}
for(auto it: myMap)
{
    result.push_back(it.second);
}

我仍然有兴趣知道是否有一种方法可以避免最终循环遍历 map 并实现我最初打算做的事情?

最佳答案

就是这部分:

{
    vector<string> newVector;
    newVector.push_back(s);
    myMap.insert(pair<string,vector<string>>(temp,newVector));
    result.push_back(newVector);
}

每次 result 都会被赋予一个包含一个元素的新 vector 。更改 map vector 而不是 vector 的 vector 的原因是因为 vector::push_back 每次都会创建一个拷贝。


要解决这个问题,有两种方法。

  1. 您可以尝试在更新 map 的同时更新结果,并获取 vector 来存储对 map 拷贝的一些引用。
  2. 由于您不使用 result 进行处理步骤,而仅使用结果,因此您可以在完成 map 后编译 vector 。

我更喜欢方法#2,因为你永远不会返回 map 本身。此外,从一种容器类型转换为另一种容器类型是一门艺术,例如 this question给出了有关所涉及内容的一些想法。

关于c++ - C++ 中 vector 的 vector 的使用 & push_back( ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38366135/

相关文章:

c++ - 为什么 c++ std::max_element 这么慢?

c++ - 如何结合 BOOST_PP_IF 和 BOOST_PP_LPAREN?

c++ - 如果用户输入 q 如何退出

c++ - 在 C++ 中修复观察者设计模式

r - 我需要在矩阵的每一列中找到第一个负数

math - 如何选择指向任何凸多边形内部的法向量(2d)?

c++ - Dlib 将自训练检测器应用于视频 (mmod_dnn)

c++ - 使用 { * this } 初始化类

c++ - 在 C++ 中按值传递字符串和 vector

c++ - 向 vector 添加多个值