相关疑难解决方法(0)

621
推荐指数
17
解决办法
33万
查看次数

什么是同时迭代两个或更多容器的最佳方法

C++ 11提供了多种迭代容器的方法.例如:

基于范围的循环

for(auto c : container) fun(c)
Run Code Online (Sandbox Code Playgroud)

的std :: for_each的

for_each(container.begin(),container.end(),fun)
Run Code Online (Sandbox Code Playgroud)

但是,建议的方法是迭代两个(或更多)相同大小的容器来完成以下操作:

for(unsigned i = 0; i < containerA.size(); ++i) {
  containerA[i] = containerB[i];
}
Run Code Online (Sandbox Code Playgroud)

c++ containers iterator c++11

98
推荐指数
10
解决办法
7万
查看次数

为什么std :: vector :: insert需要复制assign?

我试图了解以下行为:

#include <vector>
#include <iterator>    

struct Foo {
    Foo(int a) : a_ {a} {}
    const int a_; // Note the const
};

int main(int argc, char **argv) {
    std::vector<Foo> v1 {Foo {0}};
    std::vector<Foo> v2 {Foo {1}};

    auto first = std::begin(v2);
    auto last  = std::end(v2);

    for (; first != last; ++first) {
        v1.push_back(*first); // Fine
    }

    //v1.insert(v1.begin(), first, last); // Does not compile

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

事实证明,该const成员Foo隐含地删除了使用Foo的副本赋值运算符std::vector::insert.

为什么std::vector::insert需要在std::vector::push_back复制构造时复制赋值?这是否意味着手动连接两个向量可能更有效?这是使用LLVM.

c++ vector c++11

5
推荐指数
1
解决办法
1102
查看次数

插入向量c ++

我需要在下面的向量中推送66,000个向量(向量的数量不固定,它也可以是90,000个向量.为了简洁起见,我将以66,000个向量的示例显示以下代码)类型向量:

vector<int> vec;
Run Code Online (Sandbox Code Playgroud)

66,000个向量中每个向量的大小为9,000个元素.我正在使用以下内容做同样的事情:

vec.reserve(66000*9000);
for(int j=0;j<66000;j++)
    for(int i=0;i<9000;i++) //9000 elements in vec1[i] per vector is not fixed
        vec.push_back(vec1[i]); //i am pushing i as an example
Run Code Online (Sandbox Code Playgroud)

有没有什么可以提高这段代码的效率?

我需要连接太多的向量,因此相同的解决方案可能不同于连接两个向量.另外,我不能使用上一个问题中提到的多线程

c++ vector c++11

4
推荐指数
1
解决办法
208
查看次数

在向量<Point> y中变换向量<vector <Point >> x

我有一个 vector < vector < Point> > X并且想要将其中的所有元素复制到一个vector < Point > Y(并且如果可能的话以相同的顺序)我尝试了类似的东西(在for循环中):

Y.push_back(i) = X.at(i).at(i);
Run Code Online (Sandbox Code Playgroud)

但显然它不起作用......

我也发现了这个(在stackoverflow上),但它对我来说也不起作用......

for (std::vector<std::vector<Point> >::iterator it = X.begin(), itEnd = X.end(); it != itEnd; ++it)
    Y.push_back((*it));
Run Code Online (Sandbox Code Playgroud)

但是编译器告诉我"在重载中没有函数的实例"(老实说,我甚至不知道它是什么意思).

c++ vector

2
推荐指数
1
解决办法
792
查看次数

在地图中使用矢量时出错

我试图根据键将矢量添加到地图中的位置.

vector<string> words;
map<string, vector<string>> wordMap;

for (int i = 0; i < words.size(); i++) {
    string word = words.at(i);

    if (wordMap.find(word) == wordMap.end())
        wordMap.insert(make_pair(word, vector<string>()));

    vector<string> context = { "EMPTY" };

    if (i == 0)
        context = { "Beginning of words", words[i + 1], words[i + 2] };
    else if(i == 1)
        context = { "Beginning of words", words[i - 1], words[i + 1], words[i + 2] };
    else if (i == words.size() - 2)
        context = { words[i …
Run Code Online (Sandbox Code Playgroud)

c++ vector

2
推荐指数
1
解决办法
101
查看次数

如何从类中返回大型向量而不复制数据

我正在编写一个程序,其中一个类有一个大的数据成员std::vector(大约100k - 1M项).其他类需要能够访问此向量.目前我有一个标准的访问器函数返回向量,但是这会返回我相信的向量的副本.我认为只返回迭代器或指向第一个元素的指针会有更多的内存和时间效率.但是,如果我这样做,那么如何使用这个指针来运行vector并知道何时停止(即向量结束的位置)?

我的代码看起来像这样:

class MyClass
{
    private:
        std::vector<MyObj> objects_;
        //...

    public:
        std::vector<MyObj> getObjects() { return objects_; }
        //...
}
Run Code Online (Sandbox Code Playgroud)

当我想要运行(模拟)连接向量时,这个问题以另一种形式出现.如果我有一个vectorMyClass,我希望能够遍历所有所包含的object_载体.我从这个答案中知道boost :: join做了我的想法,但我认为我需要返回副本才能正常工作.我可以返回一个指向向量的指针,并且仍然能够连续迭代它和其他人吗?

c++ vector c++11

1
推荐指数
1
解决办法
1152
查看次数

标签 统计

c++ ×7

vector ×6

c++11 ×4

concatenation ×1

containers ×1

iterator ×1

stdvector ×1

stl ×1