该参考指出,
template< class ForwardIt, class UnaryPredicate >
ForwardIt remove_if( ForwardIt first, ForwardIt last, UnaryPredicate p );
Run Code Online (Sandbox Code Playgroud)
指向范围的旧端和新端之间的元素的迭代器仍然是可解除引用的,但元素本身具有未指定的值.
我尝试了这个简单的程序,通过"未指定的值"找出它们的含义.
#include <vector>
#include <memory>
#include <iostream>
#include <algorithm>
int main()
{
std::vector< std::shared_ptr<int> > ints;
for (int i = 0; i < 10; ++i)
ints.push_back(std::make_shared<int>(i));
std::remove_if(ints.begin(), ints.end(),
[](const std::shared_ptr<int>& element)
{
return *element % 7 != 0;
});
for (int i = 0; i < 10; ++i)
std::cout << *ints[i] << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
0
7
2
3 …Run Code Online (Sandbox Code Playgroud) 我正试图将我的项目从一台计算机qt4带到另一台新安装的地方qt5,我遇到了一个非常奇怪的问题.
qmake突然找不到我的任何源文件或头文件.
这是一个极简主义的例子:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = untitled
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
INCLUDEPATH += $$PWD/Dir/
DEPENDPATH += $$PWD/Dir/
HEADERS += mainwindow.h \
f.h \
FORMS += mainwindow.ui
Run Code Online (Sandbox Code Playgroud)
凡Dir/f.h存在于同一目录中untitled.pro.我从qmake得到这个输出:
05:18:45: Starting: "/opt/QtSDK/5.0.2/gcc/bin/qmake"
/home/martin/Projects/untitled/untitled.pro
-r -spec linux-g++ CONFIG+=debug CONFIG+=declarative_debug CONFIG+=qml_debug
WARNING: Failure to find: f.h
05:18:45: The process "/opt/QtSDK/5.0.2/gcc/bin/qmake" exited normally.
Run Code Online (Sandbox Code Playgroud)
我完全不知道造成这种情况的原因.可能是什么问题呢?
编辑:
当我手动添加这样的名称时:
HEADERS += Dir/f.h \
Run Code Online (Sandbox Code Playgroud)
qmake 不抱怨
LibreOffice Calc中是否有一个函数接受一个整数x和一个整数y并用该位置吐出单元格的内容?
有一个函数ADDRESS吐出给定[x; y]的地址.问题是我不知道如何取消引用它.
我的程序中有一个非常奇怪的错误.我无法在可重现的代码中隔离错误,但在我的代码中的某个位置有:
double distance, criticalDistance;
...
if (distance > criticalDistance)
{
std::cout << "first branch" << std::endl;
}
if (distance == criticalDistance)
{
std::cout << "second branch" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在调试构建中一切都很好.只执行一个分支.
但是在发布版本中,所有地狱都会破裂,有时两个分支都会被执行.
这很奇怪,因为如果我添加else条件:
if (distance > criticalDistance)
{
std::cout << "first branch" << std::endl;
}
else if (distance == criticalDistance)
{
std::cout << "second branch" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这不会发生.
请问,这可能是什么原因?我在32位计算机上的Ubuntu 13.10上使用gcc 4.8.1.
EDIT1:
我正在使用预编译器标志
EDIT2: …
我想用-1来表示尚未计算的大小:
std::vector<std::size_t> sizes(nResults, -1);
Run Code Online (Sandbox Code Playgroud)
而我想知道为什么没有更具表现力的方式:
std::vector<std::size_t> sizes(nResults, std::vector<std::size_t>::npos);
Run Code Online (Sandbox Code Playgroud) 我在像这样的Kotlin项目中使用Spring WebClient:
data class DTO(val name: String)
@Component
class Runner: ApplicationRunner
{
override fun run(args: ApplicationArguments?)
{
try
{
val dto = get<DTO>()
}
catch (e: Exception)
{
println("ERROR, all exceptions should have been caught in 'get' ")
}
}
}
inline private fun<reified TResult: Any> get(): TResult?
{
var result: TResult? = null
try
{
result = WebClient.create("https://maps.googleapis.com/maps/api/nonexisting")
.get()
.retrieve()
.bodyToMono<TResult>()
.block()
}
catch (e: Exception)
{
println("WORKS AS EXPECTED!!")
}
return result
}
Run Code Online (Sandbox Code Playgroud)
客户端将抛出一个异常,因为API将返回404.但是异常没有被捕获到它应该的位置,即在 …
这可行:
class Generic<T, R>(thingy: R)
{
val x = thingy.getX()
}
Run Code Online (Sandbox Code Playgroud)
但是参数R应该不是类签名的一部分.它仅在施工时有用.同样,泛型方法的类型参数与类的类型参数无关.
但是,这不起作用:
class Generic<T>(thingy: R)
{
val x = thingy.getX()
}
Run Code Online (Sandbox Code Playgroud)
这也不是:
class Generic<T><R>(thingy: R)
{
val x = thingy.getX()
}
Run Code Online (Sandbox Code Playgroud)
我没有在文档中找到答案.
我认为没有代码的任何解释都会更加模糊.所以这里的代码是我尽量保持一切尽可能简单的代码.
#include <vector>
#include <iostream>
class WithParametersBase
{
public:
WithParametersBase();
double getX() const {return 0.0;}
double getY() const {return 1.0;}
//let's say I want to access these members using an unified interface:
double getParameter(int index) const;
// For example index == 0 means getX and index == 1 means getY.
// I could implement it for example like this:
protected:
void addGetter(double (WithParametersBase::* getter)()const)
{
getters_.push_back(getter);
}
std::vector<double (WithParametersBase::*)()const> getters_;
};
WithParametersBase::WithParametersBase()
{
addGetter(&WithParametersBase::getX);
addGetter(&WithParametersBase::getY);
}
double WithParametersBase::getParameter(int index) const …Run Code Online (Sandbox Code Playgroud) 我正在实现合并排序算法.问题是当我尝试在算法中使用自动推导类型的向量时.
template <typename TIterator, typename TCompare>
void mergeSort(TIterator begin, TIterator end, TCompare criterium)
{
//...
auto help = *begin; // help is a value (not a reference)
QVector<decltype(help)> leftPart; // now decltype(help) is also a value
//... // and not a reference
}
Run Code Online (Sandbox Code Playgroud)
这有效.
但是一旦我使算法通过TIterators常量引用,我得到的错误是我一生中从未得到过的错误:
template <typename TIterator, typename TCompare>
void mergeSort(const TIterator& begin, const TIterator& end, TCompare criterium)
{
//...
auto help = *begin; // help is a value (not a reference)
QVector<decltype(help)> leftPart; // now decltype(help) …Run Code Online (Sandbox Code Playgroud) 当我想实现一个功能时:
template <typename TIterator>
void doSomething(TIterator begin, TIterator end);
Run Code Online (Sandbox Code Playgroud)
能够同时使用:
std::vector<Widget*>
Run Code Online (Sandbox Code Playgroud)
和
std::vector<std::shared_ptr<Widget>>
Run Code Online (Sandbox Code Playgroud)
我该如何访问底层指针?由于某种原因std::shared_ptr<Widget>,不能隐式转换为Widget*,我必须使用该get()功能.这样,代码不起作用,std::vector<Widget*>因为Widget*没有get()功能.
我这样做是:
void functionAcceptingPointer(Widget* widget);
template <typename TIterator>
void doSomething(TIterator begin, TIterator end);
{
std::map<double, decltype(&(**begin))> map;
...
auto firstPointer = &(**begin);
...
functionAcceptingPointer(&(**begin));
....
}
Run Code Online (Sandbox Code Playgroud)
这是使用操作符*后面的双重引用&,只要我需要一个普通的指针.
它完成了这项工作,但我很好奇是否有一些更易读,通常使用的方法来做到这一点,如果有一些东西可以回来困扰我,我填写我的代码与丑陋的东西,如 &(**begin)