相关疑难解决方法(0)

如何在向量增长时强制执行移动语义?

我有一个std::vector特定类的对象A.该类非常重要,并且定义了复制构造函数移动构造函数.

std::vector<A>  myvec;
Run Code Online (Sandbox Code Playgroud)

如果我用A对象填充向量(使用例如myvec.push_back(a)),则向量将增大,使用复制构造函数A( const A&)来实例化向量中元素的新副本.

我可以以某种方式强制执行类的移动构造函数A而不是使用它吗?

c++ resize vector move-semantics c++11

82
推荐指数
2
解决办法
2万
查看次数

emplace_back()的行为与预期不符

我编写了一个简单的程序,可以在标准库容器中就地创建对象.这就是我写的:

#include <vector>
#include <iostream>

class AB
{
public:
   explicit AB(int n);
   AB(const AB& other) = delete;
   AB(AB&& other);
   AB& operator=(const AB& other) = delete;
   AB& operator=(AB&& other) = default;
private:
   int i;
};

AB::AB(int n): i( n )
{
   std::cout << "Object created." << std::endl;
};

AB::AB(AB&& other): i( std::move(other.i) )
{
   std::cout << "Object moved." << std::endl;
};

int main()
{
   std::vector< AB > v;
   v.emplace_back(1);
   v.emplace_back(2);
   v.emplace_back(3);
};
Run Code Online (Sandbox Code Playgroud)

我用g ++(版本4.8.2)编译它.运行输出后,我得到:

Object created.
Object created.
Object moved.
Object …
Run Code Online (Sandbox Code Playgroud)

c++ g++ std c++11

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

std :: vector的拷贝构造函数如何运作?

std::vector<std::string>在调用以下代码时如何初始化自身

std::vector<std::string> original;
std::vector<std::string> newVector = original;
Run Code Online (Sandbox Code Playgroud)

这似乎好像拷贝构造函数会被调用的std::vector<std::string> new过程中newVector = original,却怎么都std::string带来了内部的orginal?它们是复制品还是新品std::string?内存newVector[0]也是如此original[0].

我问的原因是我做了以下事情

#include <vector>
#include <string>
using namespace std;

vector<string> globalVector;

void Initialize() {
    globalVector.push_back("One");
    globalVector.push_back("Two");
}

void DoStuff() {
    vector<string> t = globalVector;
}

int main(void) {
    Initialize();
    DoStuff();
}
Run Code Online (Sandbox Code Playgroud)

t将超出DoStuff(在非优化版本中)的范围,但是如果它t只是填充了指向std::strings in的指针globalVector,可能会调用析构函数并std::string删除所使用的内存,那么globalVector[0]填充垃圾std::string后会DoStuff是叫什么名字?

一个坚果壳,我基本上问,当std::vector调用复制构造函数时,里面的元素是如何被复制的?

c++ string vector std

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

C++:自动向量重新分配调用复制构造函数?为什么?

我正在阅读C++ Primer,3rd Ed(Lippman和Lajoie),并且它说当需要重新分配向量以便为添加的更多元素腾出空间时push_back(),元素在新空间中被复制构造然后是析构函数被称为旧元素.我很困惑为什么这是必要的 - 为什么数据不能一点一点地复制?我假设答案与动态内存分配有关,但我目前的推理方法是,即使向量元素处理动态内存,实际存储在元素中的数据也将是指针,这意味着按位复制将保留它们指向的位置并且不会出现任何问题.我可以看到如何重新定位元素指向的动态分配的内存将是一个问题,因为它会使指针无效,但据我所知,向量重新定位没有理由这样做.

有人能给我一个不应该逐位移动的类的简单例子吗?

c++ stdvector

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

为什么复制构造函数被调用25次,而插入循环只迭代10次?

我想知道为什么在下面的C++代码中,复制构造函数被调用25次10次迭代?

如果它是10那么好10/10 = 1,或者20/10 = 2,或者30/10 = 3,但是25/10 = 2.5?这.5意味着什么?

标题:

class Person
{
public:
    Person(std::string name, int age);
    Person(const Person &person);

    const std::string &getName() const;
    int getAge() const;

private:
    std::string name;
    int age;
};
Run Code Online (Sandbox Code Playgroud)

资源:

Person::Person(string name, int age) : name(std::move(name)), age(age)
{}

Person::Person(const Person &person)
{
    this->name = person.name;
    this->age = person.age;
    static int count = 0;
    count++;
    cout << ">>Copy-Person::Person(Person &person) " << count << endl;
} …
Run Code Online (Sandbox Code Playgroud)

c++ vector copy-constructor

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

push_back到std :: vector,重复调用复制构造函数

有了代码,我有以下输出:

A::A() is called
test #1
A::A(const A & other) is called
test #2
A::A(const A & other) is called
A::A(const A & other) is called
test #3
A::A(const A & other) is called
A::A(const A & other) is called
A::A(const A & other) is called
Run Code Online (Sandbox Code Playgroud)

在调试代码时,对于3个测试用例,我发现第一次复制构造函数的调用是相同的(我认为这是有意义的):制作对象的副本并推送到向量.

但是,通过"_Umove_if_noexcept"对复制构造函数进行额外调用.

对于测试#2,当vec已经有一个条目时,它将进一步调用复制构造函数的一次.

对于测试#3,当vec已经有两个条目时,它将进一步调用复制构造函数的两倍.

这在Visual Studio 2017和gcc 5.4.0上是可重现的.

为什么会这样?是否存在性能问题?

谢谢

#include <iostream>
#include <vector>
class A
{
public:
    //constructor
    A()
    {
        a = 10;
        std::cout << "A::A() is called" << std::endl;
    }

    //copy constructor …
Run Code Online (Sandbox Code Playgroud)

c++

6
推荐指数
2
解决办法
584
查看次数

传递给 std::vector::emplace_back 的类的复制构造函数的双重调用

我想了解以下代码中复制构造函数的双重调用的原因:

#include <vector>
#include <thread>
#include <algorithm>
#include <functional>
#include <iostream>
#include <mutex>

std::mutex m_stdout;

class MyWorker {
public:
  MyWorker() = default;
  MyWorker(const MyWorker& mw) {
    m_stdout.lock();
    std::cout << "MyWorker coping" << std::endl;
    m_stdout.unlock();
  }

  void operator() () {}
};

int main () {
  std::vector<std::thread> vth;
  vth.reserve(4);
  MyWorker mw;
  for (int i = 4; i > 0; --i) {
    vth.emplace_back(mw);
  }
  std::for_each(vth.begin(), vth.end(), std::mem_fn(&std::thread::join));
}
Run Code Online (Sandbox Code Playgroud)

标准输出:

MyWorker coping
MyWorker coping
MyWorker coping
MyWorker coping
MyWorker coping
MyWorker coping
MyWorker coping …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

标签 统计

c++ ×7

c++11 ×3

vector ×3

std ×2

copy-constructor ×1

g++ ×1

move-semantics ×1

resize ×1

stdvector ×1

string ×1