gpt4 book ai didi

c++ - 为什么 std::transform 使用构造函数?

转载 作者:太空宇宙 更新时间:2023-11-04 15:07:10 24 4
gpt4 key购买 nike

我使用 std::transform 将一些值添加到列表中的现有值。下面的代码工作正常,我只是想知道是否有可能在执行转换时避免对复制构造函数的所有调用(参见程序的输出)。如果我只是破解代码,并使 for 循环显式调用 Base 的 += 运算符,则不会执行任何复制构造,并且会在更有效的位置更改值。

我可以让 transform 调用 Base 的 operator+= 而不是复制构造吗?我应该专注于increment<Type>吗? ?

程序:

#include <iostream>
#include<list>
#include <algorithm>
#include <iterator>

template<class T>
class Base;

template<class T>
std::ostream& operator << (std::ostream& os, const Base<T>& b);

template<class T>
class Base
{
private:
T b_;
public:
typedef T value_type;

Base()
:
b_()
{ std::cout << "Base::def ctor" << std::endl; }

Base (const T& b)
:
b_(b)
{ std::cout << "Base::implicit conversion ctor: " << b_ << std::endl; }

const T& value()
{
return b_;
}

const Base operator+(const Base& b) const
{
std::cout << "Base operator+ " << std::endl;
return Base(b_ + b.b_);
}

const Base& operator+=(const T& t)
{
b_ += t;
return *this;
}

friend std::ostream& operator<< <T> (std::ostream& os, const Base<T>& b);
};

template<class T>
std::ostream& operator<< (std::ostream& os, const Base<T>& b)
{
os << b.b_;
return os;
}

template<class Type>
class increment
{
typedef typename Type::value_type T;

T initial_;

public:

increment()
:
initial_()
{};

increment(const T& t)
:
initial_(t)
{}

T operator()()
{
return initial_++;
}
};

template<class Container>
void write(const Container& c)
{
std::cout << "WRITE: " << std::endl;
copy(c.begin(), c.end(),
std::ostream_iterator<typename Container::value_type > (std::cout, " "));
std::cout << std::endl;
std::cout << "END WRITE" << std::endl;
}

using namespace std;

int main(int argc, const char *argv[])
{
typedef list<Base<int> > bList;

bList baseList(10);

cout << "GENERATE" << endl;
generate_n (baseList.begin(), 10, increment<Base<int> >(10));
cout << "END GENERATE" << endl;

write(baseList);

// Let's add some integers to Base<int>

cout << "TRANSFORM: " << endl;

std::transform(baseList.begin(), baseList.end(),
baseList.begin(),
bind2nd(std::plus<Base<int> >(), 4));
cout << "END TRANSFORM " << endl;

write(baseList);

// Hacking the code:
cout << "CODE HACKING: " << endl;
int counter = 4;
for (bList::iterator it = baseList.begin();
it != baseList.end();
++it)
{
*it += counter; // Force the call of the operator+=
++counter;
}
write (baseList);
cout << "END CODE HACKING" << endl;

return 0;
}

最佳答案

Base (const T& b)不是复制构造函数,它是 Base<T> 的构造函数接受 const T& .复制构造函数通常具有签名 Base(const Base& )

就是说,每次您创建一个新的 Base<int> 时都会调用您的构造函数来自 int ,这是您在加法运算符中所做的。

最后,std::transform() 使用输出迭代器赋值运算符将函数的结果赋值给输出。如果你想完全避免复制,你应该使用 std::for_each , 以及 std::bind2nd( std::mem_fun_ref(&Base<int>::operator +=), 4 )) .这将避免制作拷贝,因为它将仅对引用进行操作。

关于c++ - 为什么 std::transform 使用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11453837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com