在C++ 11中,所有元素都有两个循环(基于for和for_each的范围).是否有理由偏爱另一个或者是否存在更适合的情况?
for (auto& elem: container) {
// do something with elem
}
std::for_each(container.begin(), container.end(),
[](Elem& elem) {
// do something with elem
});
Run Code Online (Sandbox Code Playgroud)
我的想法是第一个更简单,类似于其他语言中基于范围的循环,而第二个也适用于不完整容器的序列,第二个更类似于其他std算法.
我知道你能做到
print str(myList)
Run Code Online (Sandbox Code Playgroud)
要得到
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
你可以做到
i = 0
for entry in myList:
print str(i) + ":", entry
i += 1
Run Code Online (Sandbox Code Playgroud)
要得到
0: 1
1: 2
2: 3
Run Code Online (Sandbox Code Playgroud)
但有没有类似于第一个得到类似于最后一个结果的方法?
由于我对Python的了解有限(以及文档中的一些帮助),我最好的是:
print '\n'.join([str(n) + ": " + str(entry) for (n, entry) in zip(range(0,len(myList)), myList)])
Run Code Online (Sandbox Code Playgroud)
它不是那么冗长,但至少我在一个(复合)语句中得到一个自定义字符串.你能做得更好吗?
这个问题基于我发现监控可能内存泄漏的代码,因此它包含一些您可能不希望在常规程序中看到的代码,例如排序指针。
但是,我看到设置了一个指针nullptr,然后将该指针与最大地址进行比较。是否由 C++ 标准保证nullptr总是小于其他指针operator<?
或者我们都坚持我们的教学"&&,||,!" 办法?
我们为什么要使用其中一个的任何想法?
我只是想知道,因为有几个答案说明代码应该尽可能自然,但是我没有看到很多带有"and,or,not"的代码,而这更自然.
这是关于这一点的后续问题:C++ 14中的Lambda-Over-Lambda,答案解释了代码.
它是关于lambda创建另一个lambda,在调用时,调用传递的lambda并将返回值传递给原始lambda,从而返回第二个lambda的新实例.
该示例显示了lambdas可以链接的方式.
复制原始问题:
#include <cstdio>
auto terminal = [](auto term) // <---------+
{ // |
return [=] (auto func) // | ???
{ // |
return terminal(func(term)); // >---------+
};
};
auto main() -> int
{
auto hello =[](auto s){ fprintf(s,"Hello\n"); return s; };
auto world =[](auto s){ fprintf(s,"World\n"); return s; };
terminal(stdout)
(hello)
(world) ;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是否已经有了这个结构的名称,如果不是,它应该被称为什么?它是否类似于其他语言的结构?
备注:我对它是否真的有用并不感兴趣.
#include <iostream>
struct A
{
A() { std::cout << "Def Constr\n"; }
A(const A&) { std::cout << "Copy Constr\n"; }
};
A func1()
{
return A{};
}
void func2(A a) {}
int main()
{
func2(func1());
}
Run Code Online (Sandbox Code Playgroud)
编译完成后
g ++ Copy.cpp -std = c ++ 11 -fno-elide-constructors
输出是:
Def Constr
复制Constr
复制Constr
我的问题是:为什么2复制Constr?我以为只需要1份复印件.
我可能猜测func1()会抛出一个临时对象,并且需要将此临时对象复制到另一个内存区域,并且必须再次从该区域为func2()参数创建一个副本,但它对我来说是模糊的.
你能详细解释一下吗?
我有一个容器类(包含一个多索引容器),我有一个公共的"foreach"成员函数,因此用户可以传递一个仿函数来应用所有元素.
在实现时,我遇到了一个案例,即仿函数只应该应用于容器中某个范围的某些元素,所以我重载了foreach,以传递一些有效的范围.
现在,在某些情况下,值得在某个条件下停止,所以实际上,我让foreach根据函数的返回值停止.
我对系统如何工作感到满意,但我有一个问题:
在一个范围内,如何调用停止条件的"foreach"?
任何人都知道一个通用,清晰和简洁的名称?
在重构时,我想更改一个数组,其中条目被添加到std :: vector,但是为了兼容性(持久性,降级,......),它仍然需要有一个上限.
有一个类似stl的容器的最佳方式(优雅,类似stl,有限的额外代码)是多少,所以你知道插入一个条目失败了吗?
编辑:
澄清:我想要一个类似stl的容器,它开始为空,你可以填充条目并可能删除条目并迭代填充的条目,但这不允许输入超过例如50个条目,所以几乎像一个顺序的对手,但有一个上限.
我有一些类似的代码
#define SIZE 10
Class User
{
public:
std::array<Account, SIZE> getListAccount()
{
return listAccount;
}
private:
std::array<Account, SIZE> listAccount
}
Class Account
{
public:
void setUserName(std::string newUSN)
{
userName=newUSN;
}
private:
string userName;
string password;
}
int main()
{
User xxx(.......);
xxx.getListAccount()[1].setUserName("abc"); // It doesn't effect
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么setUserName()main中的函数调用不会更改我的xxx用户名?
顺便说说:
std::array因为我想将数据保存在二进制文件中正如在这个问题中,我正在尝试使用SBRM/RAII通过类进行流式传输,所以
SBRM(x) << "test";
Run Code Online (Sandbox Code Playgroud)
可以在析构函数中做一些额外的工作,但我的模板知识似乎有限.
我所拥有的(为清晰起见更简单)是:
#include <iostream>
#include <sstream>
class SBRM
{
public:
SBRM(int j) : i(j) {}
~SBRM() { std::cout << "SBRM(" << i << "): " << oss.str() << std::endl; }
template<typename T> SBRM& operator<<(T& in) { oss << in; return *this; }
// SBRM& operator<<(const long long& in) { oss << std::hex << "0x" << in; return *this; }
SBRM& operator<<(const double& in) { oss << in; return *this; }
SBRM& operator<<(const void* in) …Run Code Online (Sandbox Code Playgroud) 以下代码显示使用boost :: bind时复制通过引用传递的参数.有没有办法防止复制而不诉诸指针(我目前用作解决方法)?(用gcc 4.4.3测试)
#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
void function1(int& x)
{
std::cout << "function1 &x: " << &x << std::endl;
}
int main()
{
int y = 0;
std::cout << "main &y: " << &y << std::endl;
boost::function<void()> f = boost::bind(function1, y);
f();
}
Run Code Online (Sandbox Code Playgroud) 我有一个向量cons char *。这实际上是一个时间戳。每次,我都获取最后一个值,将其转换为整数,然后增加40。然后将其作为const char *返回到vector。我的问题是,新值未获取push_back()。向量已经包含一些值。
我试图创建实例而不是像这样直接做
string is = to_string(y);
some_vector.push_back(is.c_str());
Run Code Online (Sandbox Code Playgroud)
我在做
string is = to_string(y);
const char * temp = is.c_str();
some_vector.push_back(temp);
Run Code Online (Sandbox Code Playgroud)
我的完整代码是
vector<const char *> TimeConstraint;
for (int i = 1; i <= 10; i++)
{
const char * tx = TimeConstraint.back();
int y;
stringstream strval;
strval << tx;
strval >> y;
y = y + 40;
string is = to_string(y);
const char* temp_pointer = is.c_str();
TimeConstraint.push_back(temp_pointer);
}
Run Code Online (Sandbox Code Playgroud)
新值未添加到TimeConstraint向量中
每次我必须push_back()时向量的最后一个元素的增量值。请帮助我,谢谢